Bagaimana cara mengganti nama file menggunakan C #?
Bagaimana cara mengganti nama file menggunakan C #?
Jawaban:
Lihatlah System.IO.File.Move , "pindahkan" file tersebut ke nama baru.
System.IO.File.Move("oldfilename", "newfilename");
System.IO.File.Move(oldNameFullPath, newNameFullPath);
Dalam metode File.Move, ini tidak akan menimpa file jika sudah ada. Dan itu akan melempar pengecualian.
Jadi kita perlu memeriksa apakah file tersebut ada atau tidak.
/* 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
Atau mengelilinginya dengan try catch untuk menghindari pengecualian.
Anda dapat menggunakannya File.Move
untuk melakukannya.
Cukup tambahkan:
namespace System.IO
{
public static class ExtendedMethod
{
public static void Rename(this FileInfo fileInfo, string newName)
{
fileInfo.MoveTo(fileInfo.Directory.FullName + "\\" + newName);
}
}
}
Lalu...
FileInfo file = new FileInfo("c:\test.txt");
file.Rename("test2.txt");
Solusi pertama
Hindari System.IO.File.Move
solusi yang diposting di sini (termasuk jawaban yang ditandai). Gagal melalui jaringan. Namun, pola salin / hapus bekerja secara lokal dan melalui jaringan. Ikuti salah satu solusi langkah, tetapi ganti dengan Salin. Kemudian gunakan File.Delete untuk menghapus file asli.
Anda dapat membuat metode Ganti nama untuk menyederhanakannya.
Kemudahan penggunaan
Gunakan unit VB di C #. Tambahkan referensi ke Microsoft.VisualBasic
Kemudian untuk mengganti nama file:
Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(myfile, newName);
Keduanya adalah string. Perhatikan bahwa myfile memiliki path lengkap. newName tidak. Sebagai contoh:
a = "C:\whatever\a.txt";
b = "b.txt";
Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(a, b);
The C:\whatever\
folder sekarang akan berisi b.txt
.
smb
), ftp
, ssh
atau apa pun semua memiliki perintah / primitif file bergerak / penggantian nama kecuali tidak diizinkan (misalnya read-only).
Anda bisa menyalinnya sebagai file baru dan kemudian menghapus yang lama menggunakan System.IO.File
kelas:
if (File.Exists(oldName))
{
File.Copy(oldName, newName, true);
File.Delete(oldName);
}
CATATAN: Dalam kode contoh ini kita membuka direktori dan mencari file PDF dengan tanda kurung terbuka dan tertutup dalam nama file. Anda dapat memeriksa dan mengganti karakter apa pun dalam nama yang Anda suka atau hanya menentukan nama baru menggunakan fungsi ganti
Ada cara lain untuk bekerja dari kode ini untuk melakukan perubahan nama yang lebih rumit, tetapi tujuan utama saya adalah untuk menunjukkan cara menggunakan File.Move untuk melakukan perubahan nama batch. Ini bekerja melawan 335 file PDF di 180 direktori ketika saya menjalankannya di laptop saya. Ini memacu kode momen dan ada cara yang lebih rumit untuk melakukannya.
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();
}
}
}
Semoga! ini akan sangat membantu anda. :)
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);
}
}
Bagaimana cara menggunakan kode ini?
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);
}
}
Menggunakan:
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;
)?
Dalam kasus saya, saya ingin nama file yang diganti nama menjadi unik, jadi saya menambahkan cap tanggal-waktu ke nama. Dengan cara ini, nama file dari log 'lama' selalu unik:
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"))));
}
}
Bergerak melakukan hal yang sama = Salin dan Hapus yang lama.
File.Move(@"C:\ScanPDF\Test.pdf", @"C:\BackupPDF\" + string.Format("backup-{0:yyyy-MM-dd_HH:mm:ss}.pdf",DateTime.Now));
Saya tidak dapat menemukan pendekatan yang cocok untuk saya, jadi saya mengusulkan versi saya. Tentu saja butuh input, penanganan kesalahan.
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);
}
}
Saya telah menemukan suatu kasus ketika saya harus mengganti nama file di dalam pengendali event, yang memicu untuk setiap perubahan file, termasuk mengganti nama, dan untuk melewati selamanya mengubah nama file yang saya harus menamainya, dengan:
File.Copy(fileFullPath, destFileName); // both has the format of "D:\..\..\myFile.ext"
Thread.Sleep(100); // wait OS to unfocus the file
File.Delete(fileFullPath);
Untuk berjaga-jaga jika seseorang, akan memiliki skenario seperti itu;)
int rename(const char * oldname, const char * newname);
fungsi rename () didefinisikan dalam file header stdio.h. Itu mengubah nama file atau direktori dari oldname ke newname. Operasi ganti nama sama dengan memindahkan, maka Anda juga dapat menggunakan fungsi ini untuk memindahkan file.
Ketika C # tidak memiliki beberapa fitur, saya menggunakan C ++ atau 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);
}
}