用C#重命名一个文件

如何使用C#重命名文件?

看看System.IO.File.Move ,将文件“移动”到一个新的名字。

System.IO.File.Move("oldfilename", "newfilename"); 
 System.IO.File.Move(oldNameFullPath, newNameFullPath); 

你可以使用File.Move来做到这一点。

在File.Move方法中,如果文件已经存在,则不会覆盖该文件。 它会抛出一个exception。

所以我们需要检查文件是否存在。

 /* Delete the file if exists, else no exception thrown. */ File.Delete(newFileName); // Delete the existing file if exists File.Move(oldFileName,newFileName); // Rename the oldFileName into newFileName 

或用try catch包围它以避免exception。

只需添加:

 namespace System.IO { public static class ExtendedMethod { public static void Rename(this FileInfo fileInfo, string newName) { fileInfo.MoveTo(fileInfo.Directory.FullName + "\\" + newName); } } } 

接着…

 FileInfo file = new FileInfo("c:\test.txt"); file.Rename("test2.txt"); 
  1. 首先解决scheme

    避免在这里发布System.IO.File.Move解决scheme(包括标记的答案)。 它通过networking失败。 但是,复制/删除模式在本地和通过networking工作。 按照其中一个移动解决scheme,但将其replace为Copy。 然后使用File.Delete删除原始文件。

    您可以创build一个Rename方法来简化它。

  2. 使用方便

    在C#中使用VB程序集。 将引用添加到Microsoft.VisualBasic

    然后重命名文件:

    Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(myfile, newName);

    两者都是string。 请注意,myfile具有完整的path。 newName不。 例如:

     a = "C:\whatever\a.txt"; b = "b.txt"; Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(a, b); 

    C:\whatever\文件夹现在将包含b.txt

您可以将其复制为新文件,然后使用System.IO.File类删除旧文件:

 if (File.Exists(oldName)) { File.Copy(oldName, newName, true); File.Delete(oldName); } 

注意:在这个示例代码中,我们打开一个目录并search文件名中带有开放和闭合圆括号的PDF文件。 你可以用你喜欢的名字检查和replace任何字符,或者用replace函数指定一个全新的名字。

还有其他的方法来从这个代码工作,做更多精心的重命名,但我的主要目的是显示如何使用File.Move做一个批量重命名。 当我在笔记本电脑上运行它时,这对180个目录中的335个PDF文件起作用。 这是现在的代码的刺激,并有更多的精心制作的方法来做到这一点。

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BatchRenamer { class Program { static void Main(string[] args) { var dirnames = Directory.GetDirectories(@"C:\the full directory path of files to rename goes here"); int i = 0; try { foreach (var dir in dirnames) { var fnames = Directory.GetFiles(dir, "*.pdf").Select(Path.GetFileName); DirectoryInfo d = new DirectoryInfo(dir); FileInfo[] finfo = d.GetFiles("*.pdf"); foreach (var f in fnames) { i++; Console.WriteLine("The number of the file being renamed is: {0}", i); if (!File.Exists(Path.Combine(dir, f.ToString().Replace("(", "").Replace(")", "")))) { File.Move(Path.Combine(dir, f), Path.Combine(dir, f.ToString().Replace("(", "").Replace(")", ""))); } else { Console.WriteLine("The file you are attempting to rename already exists! The file path is {0}.", dir); foreach (FileInfo fi in finfo) { Console.WriteLine("The file modify date is: {0} ", File.GetLastWriteTime(dir)); } } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } } } 

使用:

 Using System.IO; string oldFilePath = @"C:\OldFile.txt"; // Full path of old file string newFilePath = @"C:\NewFile.txt"; // Full path of new file if (File.Exists(newFilePath)) { File.Delete(newFilePath); } File.Move(oldFilePath, newFilePath); 

移动是这样做的=复制和删除旧的。

 File.Move(@"C:\ScanPDF\Test.pdf", @"C:\BackupPDF\" + string.Format("backup-{0:yyyy-MM-dd_HH:mm:ss}.pdf",DateTime.Now)); 

希望! 这对你有帮助。 🙂

  public static class FileInfoExtensions { /// <summary> /// behavior when new filename is exist. /// </summary> public enum FileExistBehavior { /// <summary> /// None: throw IOException "The destination file already exists." /// </summary> None = 0, /// <summary> /// Replace: replace the file in the destination. /// </summary> Replace = 1, /// <summary> /// Skip: skip this file. /// </summary> Skip = 2, /// <summary> /// Rename: rename the file. (like a window behavior) /// </summary> Rename = 3 } /// <summary> /// Rename the file. /// </summary> /// <param name="fileInfo">the target file.</param> /// <param name="newFileName">new filename with extension.</param> /// <param name="fileExistBehavior">behavior when new filename is exist.</param> public static void Rename(this System.IO.FileInfo fileInfo, string newFileName, FileExistBehavior fileExistBehavior = FileExistBehavior.None) { string newFileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(newFileName); string newFileNameExtension = System.IO.Path.GetExtension(newFileName); string newFilePath = System.IO.Path.Combine(fileInfo.Directory.FullName, newFileName); if (System.IO.File.Exists(newFilePath)) { switch (fileExistBehavior) { case FileExistBehavior.None: throw new System.IO.IOException("The destination file already exists."); case FileExistBehavior.Replace: System.IO.File.Delete(newFilePath); break; case FileExistBehavior.Rename: int dupplicate_count = 0; string newFileNameWithDupplicateIndex; string newFilePathWithDupplicateIndex; do { dupplicate_count++; newFileNameWithDupplicateIndex = newFileNameWithoutExtension + " (" + dupplicate_count + ")" + newFileNameExtension; newFilePathWithDupplicateIndex = System.IO.Path.Combine(fileInfo.Directory.FullName, newFileNameWithDupplicateIndex); } while (System.IO.File.Exists(newFilePathWithDupplicateIndex)); newFilePath = newFilePathWithDupplicateIndex; break; case FileExistBehavior.Skip: return; } } System.IO.File.Move(fileInfo.FullName, newFilePath); } } 

如何使用这个代码?

 class Program { static void Main(string[] args) { string targetFile = System.IO.Path.Combine(@"D://test", "New Text Document.txt"); string newFileName = "Foo.txt"; // full pattern System.IO.FileInfo fileInfo = new System.IO.FileInfo(targetFile); fileInfo.Rename(newFileName); // or short form new System.IO.FileInfo(targetFile).Rename(newFileName); } } 

在我的情况下,我想重命名的文件的名称是唯一的,所以我添加一个date时间戳到名称。 这样,“旧”日志的文件名总是唯一的:

  if (File.Exists(clogfile)) { Int64 fileSizeInBytes = new FileInfo(clogfile).Length; if (fileSizeInBytes > 5000000) { string path = Path.GetFullPath(clogfile); string filename = Path.GetFileNameWithoutExtension(clogfile); System.IO.File.Move(clogfile, Path.Combine(path, string.Format("{0}{1}.log", filename, DateTime.Now.ToString("yyyyMMdd_HHmmss")))); } } 

当C#没有某些function时,我使用C ++或C:

 public partial class Program { [DllImport("msvcrt", CallingConvention = CallingConvention.Cdecl, SetLastError = true)] public static extern int rename( [MarshalAs(UnmanagedType.LPStr)] string oldpath, [MarshalAs(UnmanagedType.LPStr)] string newpath); static void FileRename() { while (true) { Console.Clear(); Console.Write("Enter a folder name: "); string dir = Console.ReadLine().Trim('\\') + "\\"; if (string.IsNullOrWhiteSpace(dir)) break; if (!Directory.Exists(dir)) { Console.WriteLine("{0} does not exist", dir); continue; } string[] files = Directory.GetFiles(dir, "*.mp3"); for (int i = 0; i < files.Length; i++) { string oldName = Path.GetFileName(files[i]); int pos = oldName.IndexOfAny(new char[] { '0', '1', '2' }); if (pos == 0) continue; string newName = oldName.Substring(pos); int res = rename(files[i], dir + newName); } } Console.WriteLine("\n\t\tPress any key to go to main menu\n"); Console.ReadKey(true); } }