2012-09-10 33 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); 
    }