Saya benci untuk menambahkan bahwa ada masalah di sini semua solusi di sini terutama jika Anda membandingkan dan memindahkan file dari satu lokasi ke lokasi (direktori dan nama file) sejauh Anda harus menyadari bahwa volume dapat menjadi titik persimpangan ... jadi jika newname adalah q: \ SomeJunctionDirectory \ hello.txt dan nama lama adalah c: \ TargetOfJunctionPoint \ hello.txt ... file-nya sama tetapi namanya tidak.
Solusi ini tidak berfungsi ketika nama file hanya berbeda dalam huruf besar-kecil. Misalnya file.txt dan File.txt
SepehrM
2
@SepehrM, saya baru saja mengecek dan berfungsi dengan baik pada mesin Windows 8.1 saya.
Chris Taylor
1
@SepehrM, saya tidak mengujinya, tetapi sampel yang Anda tunjuk menggunakan FileInfo.Move dan bukan File.Move jadi mungkin itu ada hubungannya dengan itu?
Chris Taylor
2
@SepehrM Nama sistem file Windows tidak peka huruf besar-kecil. File.txt dan file.txt diperlakukan sebagai nama file yang sama. Jadi tidak jelas bagi saya ketika Anda mengatakan solusinya tidak bekerja. Apa yang sedang Anda lakukan yang sebenarnya tidak berhasil?
Michael
4
@Michael, sistem file tidak peka huruf besar-kecil, tetapi ia menyimpan nama file dalam huruf asli seperti yang dimasukkan oleh pengguna. Dalam kasus SepehrM, ia mencoba mengubah kasus file, yang karena beberapa alasan tidak berfungsi. Pencocokan case tidak sensitif bekerja. HTH
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 existsFile.Move(oldFileName,newFileName);// Rename the oldFileName into newFileName
Atau mengelilinginya dengan try catch untuk menghindari pengecualian.
berhati-hatilah dengan pendekatan ini ... jika direktori tujuan dan direktori sumber Anda sama, dan "nama baru" sebenarnya versi "caseFileName" yang peka huruf besar-kecil, Anda akan menghapus sebelum Anda mendapatkan kesempatan untuk memindahkan file Anda.
Adrian Hum
1
Anda juga tidak bisa hanya memeriksa string untuk kesetaraan karena ada beberapa cara untuk mewakili jalur file tunggal.
Drew Noakes
File.Move memiliki metode overload sekarang yang memungkinkan Anda untuk menimpa file - File.Move (oldPath, newPath, true)
Ella
39
Anda dapat menggunakannya File.Moveuntuk melakukannya.
Hindari System.IO.File.Movesolusi 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
asal tahu saja, Microsoft.VisualBasic.FileIO.FileSystem.RenameFile memanggil File.Move. Lain terima kasih menormalkan file asli dan melakukan beberapa pemeriksaan kesalahan tambahan pada argumen yaitu. file ada, nama file tidak null dll. kemudian memanggil File.Move.
Chris Taylor
Kecuali Salin () menyalin semua aliran file, yang saya anggap tidak, saya akan tinggal jauh dari menggunakan delete / copy. Saya berasumsi Move (), setidaknya ketika tetap pada sistem file yang sama, hanyalah sebuah nama baru dan dengan demikian semua aliran file akan dipertahankan.
nickdu
"Itu gagal melalui jaringan" maka Anda akan menyalin & menghapus yang sebenarnya unduh & unggah, hanya untuk kenyamanan waktu kode ... Jaringan seperti apa? Jendela folder bersama ( smb), ftp, sshatau apa pun semua memiliki perintah / primitif file bergerak / penggantian nama kecuali tidak diizinkan (misalnya read-only).
Meow Cat 2012
16
Anda bisa menyalinnya sebagai file baru dan kemudian menghapus yang lama menggunakan System.IO.Filekelas:
Catatan untuk siapa saja yang membaca ini: Ini adalah pola-anti, file mungkin dihapus atau diganti oleh proses lain atau OS antara cek untuk apakah ada dan panggilan Anda untuk Menyalin. Sebagai gantinya, Anda perlu menggunakan try catch.
user9993
Jika volumenya sama, ini juga merupakan pemborosan besar I / O karena langkah sebenarnya akan mengubah nama pada tingkat informasi direktori.
Adrian Hum
Saya sedang memproses ribuan file dan mendapat kesan Salin / Hapus lebih cepat dari Pindah.
Roberto
Bagaimana orang bisa datang dengan ide seperti itu. Lebih cepat atau tidak setidaknya Anda membunuh disk. Dengan mengatakan "ganti nama" dalam pertanyaan itu harus berarti mengganti nama secara lokal yang tentu saja tidak melibatkan perpindahan lintas-partisi.
Meow Cat 2012
dengan File.Move saya berlari ke UnauthorizedAccessException, tetapi urutan Salin dan Hapus ini berfungsi. Terima kasih!
Oliver Konig
6
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{classProgram{staticvoidMain(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 =newDirectoryInfo(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();}}}
Itu ... benar-benar di luar intinya, pada pertanyaan yang dijawab tepat ke titik 3 tahun lalu.
Nyerguds
2
Itu contoh yang valid. Mungkin terlalu banyak tetapi tidak intinya. +1
Adam
1
@ Adam: ini adalah implementasi yang sangat spesifik dari jawaban persis yang sudah diberikan tiga tahun sebelumnya, pada pertanyaan yang bukan tentang implementasi spesifik apa pun di tempat pertama. Tidak melihat bagaimana itu konstruktif.
Nyerguds
@Nyerguds maka kita memiliki definisi yang berbeda dari 'selain itu', yang tidak mengejutkan karena ini adalah istilah subjektif.
Adam
@Nyerguds jika tidak relevan bagi Anda maka itu baik-baik saja. Beberapa orang menyukai verbositas karena ini membantu mereka menemukan implementasi "dunia nyata" dari kode "contoh / contoh". Itu mengubah nama file. Bagaimana hal itu di samping intinya sama seperti yang dikatakan Adam, itu subjektif. Untuk beberapa alasan Anda merasa itu benar-benar objektif. Oh well, untuk masing-masing miliknya. Terima kasih atas masukannya.
MicRoc
6
Semoga! ini akan sangat membantu anda. :)
publicstaticclassFileInfoExtensions{/// <summary>/// behavior when new filename is exist./// </summary>publicenumFileExistBehavior{/// <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>publicstaticvoidRename(thisSystem.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){caseFileExistBehavior.None:thrownewSystem.IO.IOException("The destination file already exists.");caseFileExistBehavior.Replace:System.IO.File.Delete(newFilePath);break;caseFileExistBehavior.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;caseFileExistBehavior.Skip:return;}}System.IO.File.Move(fileInfo.FullName, newFilePath);}}
Bagaimana cara menggunakan kode ini?
classProgram{staticvoidMain(string[] args){string targetFile =System.IO.Path.Combine(@"D://test","New Text Document.txt");string newFileName ="Foo.txt";// full patternSystem.IO.FileInfo fileInfo =newSystem.IO.FileInfo(targetFile);
fileInfo.Rename(newFileName);// or short formnewSystem.IO.FileInfo(targetFile).Rename(newFileName);}}
using System.IO;string oldFilePath =@"C:\OldFile.txt";// Full path of old filestring newFilePath =@"C:\NewFile.txt";// Full path of new fileif(File.Exists(newFilePath)){File.Delete(newFilePath);}File.Move(oldFilePath, newFilePath);
Jika Anda akan melakukan ini, saya sarankan memeriksa bahwa 'oldFilePath' ada sebelum melakukan sesuatu ... atau Anda akan menghapus 'newFilePath' tanpa alasan.
John Kroetch
Apakah itu bahkan mengkompilasi ( Using System.IO;)?
Peter Mortensen
3
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:
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:
Membuat salinannya
Menghapus yang asli
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(constchar* oldname,constchar* 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.
Selamat datang. Pertanyaan ini adalah tentang mengganti nama file menggunakan bahasa C #. Saya tidak yakin bagaimana menunjukkan sesuatu dari perpustakaan standar C (bukan C #) membantu di sini.
Jeff Dammeyer
-10
Ketika C # tidak memiliki beberapa fitur, saya menggunakan C ++ atau C:
publicpartialclassProgram{[DllImport("msvcrt",CallingConvention=CallingConvention.Cdecl,SetLastError=true)]publicstaticexternint rename([MarshalAs(UnmanagedType.LPStr)]string oldpath,[MarshalAs(UnmanagedType.LPStr)]string newpath);staticvoidFileRename(){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(newchar[]{'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);}}
Jawaban:
Lihatlah System.IO.File.Move , "pindahkan" file tersebut ke nama baru.
sumber
sumber
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.
Atau mengelilinginya dengan try catch untuk menghindari pengecualian.
sumber
Anda dapat menggunakannya
File.Move
untuk melakukannya.sumber
Cukup tambahkan:
Lalu...
sumber
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:
The
C:\whatever\
folder sekarang akan berisib.txt
.sumber
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:sumber
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.
sumber
Bagaimana cara menggunakan kode ini?
sumber
Menggunakan:
sumber
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:
sumber
Bergerak melakukan hal yang sama = Salin dan Hapus yang lama.
sumber
Saya tidak dapat menemukan pendekatan yang cocok untuk saya, jadi saya mengusulkan versi saya. Tentu saja butuh input, penanganan kesalahan.
sumber
sumber
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:
Untuk berjaga-jaga jika seseorang, akan memiliki skenario seperti itu;)
sumber
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.
sumber
Ketika C # tidak memiliki beberapa fitur, saya menggunakan C ++ atau C:
sumber