Làm cách nào để đổi tên tệp bằng C #?
Làm cách nào để đổi tên tệp bằng C #?
Câu trả lời:
Hãy xem System.IO.File.Move , "di chuyển" tệp sang một tên mới.
System.IO.File.Move("oldfilename", "newfilename");
System.IO.File.Move(oldNameFullPath, newNameFullPath);
Trong phương thức File.Move, điều này sẽ không ghi đè lên tệp nếu nó đã tồn tại. Và nó sẽ ném một ngoại lệ.
Vì vậy, chúng ta cần kiểm tra xem tập tin có tồn tại hay không.
/* 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
Hoặc bao quanh nó bằng một cái bẫy thử để tránh một ngoại lệ.
Bạn có thể sử dụng File.Move
để làm điều đó.
Chỉ cần thêm:
namespace System.IO
{
public static class ExtendedMethod
{
public static void Rename(this FileInfo fileInfo, string newName)
{
fileInfo.MoveTo(fileInfo.Directory.FullName + "\\" + newName);
}
}
}
Và sau đó...
FileInfo file = new FileInfo("c:\test.txt");
file.Rename("test2.txt");
Giải pháp đầu tiên
Tránh System.IO.File.Move
các giải pháp được đăng ở đây (bao gồm câu trả lời). Nó thất bại trên các mạng. Tuy nhiên, sao chép / xóa mẫu hoạt động cục bộ và qua mạng. Thực hiện theo một trong các giải pháp di chuyển, nhưng thay thế bằng Sao chép thay thế. Sau đó sử dụng File.Delete để xóa tệp gốc.
Bạn có thể tạo một phương thức Đổi tên để đơn giản hóa nó.
Dễ sử dụng
Sử dụng lắp ráp VB trong C #. Thêm tham chiếu đến Microsoft.VisualBasic
Sau đó đổi tên tập tin:
Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(myfile, newName);
Cả hai đều là chuỗi. Lưu ý rằng myfile có đường dẫn đầy đủ. Tên mới không. Ví dụ:
a = "C:\whatever\a.txt";
b = "b.txt";
Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(a, b);
Các C:\whatever\
thư mục sẽ chứa b.txt
.
smb
), ftp
, ssh
hoặc bất cứ điều gì tất cả có các lệnh / nguyên thủy cho tập tin di chuyển / đổi tên trừ khi không được phép (ví dụ read-only).
Bạn có thể sao chép nó dưới dạng tệp mới và sau đó xóa tệp cũ bằng System.IO.File
lớp:
if (File.Exists(oldName))
{
File.Copy(oldName, newName, true);
File.Delete(oldName);
}
GHI CHÚ: Trong mã ví dụ này, chúng tôi mở một thư mục và tìm kiếm các tệp PDF với dấu ngoặc đơn mở và đóng trong tên của tệp. Bạn có thể kiểm tra và thay thế bất kỳ ký tự nào trong tên bạn thích hoặc chỉ định một tên hoàn toàn mới bằng cách sử dụng các chức năng thay thế.
Có nhiều cách khác để làm việc từ mã này để thực hiện các đổi tên phức tạp hơn nhưng mục đích chính của tôi là chỉ ra cách sử dụng File.Move để thực hiện đổi tên hàng loạt. Điều này đã làm việc với 335 tệp PDF trong 180 thư mục khi tôi chạy nó trên máy tính xách tay của mình. Đây là sự thúc đẩy của mã thời điểm và có nhiều cách phức tạp hơn để làm điều đó.
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();
}
}
}
Hy vọng! nó sẽ hữu ích cho bạn :)
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);
}
}
Làm thế nào để sử dụng mã này?
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);
}
}
Sử dụng:
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);
Using System.IO;
)?
Trong trường hợp của tôi, tôi muốn tên của tệp được đổi tên là duy nhất, vì vậy tôi thêm dấu thời gian vào tên. Bằng cách này, tên tệp của nhật ký 'cũ' luôn là duy nhất:
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"))));
}
}
Di chuyển đang làm tương tự = Sao chép và xóa cái cũ.
File.Move(@"C:\ScanPDF\Test.pdf", @"C:\BackupPDF\" + string.Format("backup-{0:yyyy-MM-dd_HH:mm:ss}.pdf",DateTime.Now));
Tôi không thể tìm thấy phương pháp phù hợp với mình, vì vậy tôi đề xuất phiên bản của mình. Tất nhiên cần đầu vào, xử lý lỗi.
public void Rename(string filePath, string newFileName)
{
var newFilePath = Path.Combine(Path.GetDirectoryName(filePath), newFileName + Path.GetExtension(filePath));
System.IO.File.Move(filePath, newFilePath);
}
public static class ImageRename
{
public static void ApplyChanges(string fileUrl,
string temporaryImageName,
string permanentImageName)
{
var currentFileName = Path.Combine(fileUrl,
temporaryImageName);
if (!File.Exists(currentFileName))
throw new FileNotFoundException();
var extention = Path.GetExtension(temporaryImageName);
var newFileName = Path.Combine(fileUrl,
$"{permanentImageName}
{extention}");
if (File.Exists(newFileName))
File.Delete(newFileName);
File.Move(currentFileName, newFileName);
}
}
Tôi đã gặp phải một trường hợp khi tôi phải đổi tên tệp bên trong trình xử lý sự kiện, điều này đã kích hoạt bất kỳ thay đổi tệp nào, bao gồm đổi tên và bỏ qua việc đổi tên mãi mãi tệp mà tôi phải đổi tên, với:
File.Copy(fileFullPath, destFileName); // both has the format of "D:\..\..\myFile.ext"
Thread.Sleep(100); // wait OS to unfocus the file
File.Delete(fileFullPath);
Chỉ trong trường hợp nếu ai đó, sẽ có kịch bản như vậy;)
int rename(const char * oldname, const char * newname);
Hàm rename () được định nghĩa trong tệp tiêu đề stdio.h. Nó đổi tên một tập tin hoặc thư mục từ tên cũ thành tên mới. Thao tác đổi tên cũng giống như di chuyển, do đó bạn cũng có thể sử dụng chức năng này để di chuyển tệp.
Khi C # không có một số tính năng, tôi sử dụng C ++ hoặ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);
}
}