2012-09-10 34 views
15

ho più di 1000 file nella cartella con il nome come abc_1, abc_2 ... abc_nRinominare i file nella cartella C#

voglio cancellare questo prefisso 'abc_' da tutti i file. Ogni possibilità di non fare questo manuale perché sono più di 1000 e sarà doloroso.

Come si può fare con C#?

+0

Forse un buon candidato per uno script PowerShell –

+0

un'occhiata a questo http://stackoverflow.com/questions/2023975/renaming-a-directory-in-c-sharp –

+0

si Volevano eliminare il prefisso ? – aliboy38

risposta

56

Si può provare con questo codice

DirectoryInfo d = new DirectoryInfo(@"C:\DirectoryToAccess"); 
FileInfo[] infos = d.GetFiles(); 
foreach(FileInfo f in infos) 
{ 
    File.Move(f.FullName, f.FullName.Replace("abc_","")); 
} 
+0

Oh, avevo 10 secondi di ritardo. +1 per DirectoryInfo e FileInfo – DoomerDGR8

+0

@Candie, grazie. Questo funziona perfettamente. –

+0

Sono felice di aiutarti, Jason, thak 'you –

2

È possibile enumerare il file.

using System.IO; 

string[] filePaths = Directory.GetFiles(@"c:\MyDir\"); 

Poi, PerOgni la stringa [] e creare una nuova istanza dell'oggetto IO.File.

Una volta ottenuto un handle su un file, basta chiamare il metodo Move e passare String.Replace ("abc_", String.Empty).

Ho detto Move perché non esiste un metodo Rename diretto in IO.File.

File.Move(oldFileName, newFileName);

essere consapevoli dell'estensione.

1

Total Commander ha la possibilità di rename multiple files (Non è necessario programmare uno strumento da solo per ogni piccola attività).

+0

In realtà non lo sapevo. Grazie! –

+0

Non sapevo eather. Grazie anche a te! –

1

È possibile utilizzare File.Move e String.Substring(index):

var prefix = "abc_"; 
var rootDir = @"C:\Temp"; 
var fileNames = Directory.EnumerateFiles(rootDir, prefix + "*", SearchOption.AllDirectories); 
foreach(String path in fileNames) 
{ 
    var dir = Path.GetDirectoryName(path); 
    var fileName = Path.GetFileName(path); 
    var newPath = Path.Combine(dir, fileName.Substring(prefix.Length)); 
    File.Move(path, newPath); 
} 

Nota: Directory.EnumerateFiles(rootDir, prefix + "*", SearchOption.AllDirectories); cercherà anche le sottocartelle dalla directory root. Se questo non è destinato all'uso SearchOption.TopDirectoryOnly.

2

Si dovrebbe dare un'occhiata alla classe DirectoryInfo e al metodo GetFiles(). E dare un'occhiata alla classe File che fornisce il metodo Move().

File.Move(oldFileName, newFileName); 
1
string path = @"C:\NewFolder\";  
string[] filesInDirectpry = Directory.GetFiles(path, "abc*"); 
forearch(string file in filesInDirectory) 
{ 
    FileInfo fileInfo = new FileInfo(file); 
    fileInfo.MoveTo(path + "NewUniqueFileNamHere"); 
} 
3

seguito il codice funzionerà, non testato però,

public class FileNameFixer 
    { 
     public FileNameFixer() 
     { 
      StringToRemove = "_"; 
      StringReplacement = ""; 


     } 
     public void FixAll(string directory) 
     { 
      IEnumerable<string> files = Directory.EnumerateFiles(directory); 
      foreach (string file in files) 
      { 
       try 
       { 
        FileInfo info = new FileInfo(file); 
        if (!info.IsReadOnly && !info.Attributes.HasFlag(FileAttributes.System)) 
        { 
         string destFileName = GetNewFile(file); 
         info.MoveTo(destFileName); 
        } 
       } 
       catch (Exception ex) 
       { 
        Debug.Write(ex.Message); 
       } 
      } 
     } 

     private string GetNewFile(string file) 
     { 
      string nameWithoutExtension = Path.GetFileNameWithoutExtension(file); 
      if (nameWithoutExtension != null && nameWithoutExtension.Length > 1) 
      { 
       return Path.Combine(Path.GetDirectoryName(file), 
        file.Replace(StringToRemove, StringReplacement) + Path.GetExtension(file)); 
      } 
      return file; 
     } 

     public string StringToRemove { get; set; } 

     public string StringReplacement { get; set; } 
    } 

è possibile utilizzare questa classe come,

FileNameFixer fixer=new FileNameFixer(); 
     fixer.StringReplacement = String.Empty; 
     fixer.StringToRemove = "@@"; 
     fixer.FixAll("C:\\temp"); 
+0

Funzionante bene :) Ho provato e usarlo. – Sublime

-2

questo comando farebbe il trucco, utilizzando rename:

$ rename --find "abc_" * 
1

Mi piace la semplicità della risposta con i voti più alti, ma non volevo che il percorso del file venisse modificato così ho cambiato leggermente il codice ...

string searchString = "_abc_"; 
string replaceString = "_123_"; 
string searchDirectory = @"\\unc\path\with\slashes\"; 
int counter = 0; 
DirectoryInfo d = new DirectoryInfo(searchDirectory); 
FileInfo[] infos = d.GetFiles(); 
foreach(FileInfo f in infos) 
{ 
    if (f.Name.Contains(searchString)) 
    { 
     File.Move(searchDirectory+f.Name, searchDirectory+ f.Name.Replace(searchString, replaceString)); 
     counter++; 
    } 
} 
Debug.Print("Files renamed" + counter); 
1

Questo codice consente all'utente di sostituire una parte del nome del file. Utile se ci sono molti file in una directory che hanno la stessa parte.

using System; 
using System.IO; 

// ... 
    static void Main(string[] args) 
    { 
     FileRenamer(@"D:\C++ Beginner's Guide", "Module", "PDF"); 

     Console.Write("Press any key to quit . . . "); 
     Console.ReadKey(true); 
    } 

    static void FileRenamer(string source, string search, string replace) 
    { 
     string[] files = Directory.GetFiles(source); 

     foreach (string filepath in files) 
     { 
      int fileindex = filepath.LastIndexOf('\\'); 
      string filename = filepath.Substring(fileindex); 

      int startIndex = filename.IndexOf(search); 
      if (startIndex == -1) 
       continue; 
      int endIndex = startIndex + search.Length; 

      string newName = filename.Substring(0, startIndex); 
      newName += replace; 
      newName += filename.Substring(endIndex); 

      string fileAddress = filepath.Substring(0, fileindex); 
      fileAddress += newName; 

      File.Move(filepath, fileAddress); 
     } 

     string[] subdirectories = Directory.GetDirectories(source); 
     foreach (string subdirectory in subdirectories) 
      FileRenamer(subdirectory, search, replace); 
    } 
Problemi correlati