2012-09-10 63 views
15

重命名文件我有超過1000個文件與文件夾的名字一樣abc_1,abc_2 ... abc_n在文件夾C#

我想刪除所有文件這個前綴「abc_」。任何不做這個手冊的機會,因爲他們超過1000,並且會很痛苦。

如何用c#做到這一點?

+0

也許一個很好的候選人PowerShell腳本 –

+0

看看這個http://stackoverflow.com/questions/2023975/renaming-a-directory-in-c-sharp –

+0

你只是想刪除前綴? – aliboy38

回答

56

您可以使用此代碼

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

哦,我遲到了10秒。 +1 DirectoryInfo和FileInfo @Candie, – DoomerDGR8

+0

,謝謝。這工作完美。 –

+0

我很樂意幫助你Jason,thak'你 –

2

您可以枚舉文件試試。

using System.IO; 

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

然後,的ForEach字符串[],並創建IO.File對象的新實例。

一旦你得到一個文件的句柄,只需調用Move方法並傳入String.Replace(「abc_」,String.Empty)。

我說Move是因爲IO.File中沒有直接的Rename方法。

File.Move(oldFileName, newFileName);

要留意的擴展。

1

您可以使用File.MoveString.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); 
} 

注:Directory.EnumerateFiles(rootDir, prefix + "*", SearchOption.AllDirectories);也將搜索從你的根目錄下的子文件夾。如果這不是打算使用SearchOption.TopDirectoryOnly

2

你應該看看DirectoryInfo類和GetFiles()方法。並看看提供Move()方法的File類。

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

下面的代碼工作,而不是雖然測試,

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; } 
    } 

你可以使用這個類的,

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

其工作正常:)我已經測試和使用它。 – Sublime

-2

這個命令會做的伎倆,利用rename

$ rename --find "abc_" * 
1

我喜歡簡單的答案與最多票,但我不希望文件路徑得到修改,所以我稍微改變了代碼...

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

此代碼使用戶能夠替換文件名的一部分。如果目錄中有許多文件具有相同的部分,則這很有用。

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); 
    }