C # kullanarak bir dosyayı nasıl yeniden adlandırabilirim?
C # kullanarak bir dosyayı nasıl yeniden adlandırabilirim?
Yanıtlar:
System.IO.File.Move dosyasına bir bakın , dosyayı yeni bir isme "taşıyın".
System.IO.File.Move("oldfilename", "newfilename");
System.IO.File.Move(oldNameFullPath, newNameFullPath);
File.Move yönteminde, zaten varsa dosyanın üzerine yazılmaz. Ve bir istisna atacak.
Bu yüzden dosyanın var olup olmadığını kontrol etmeliyiz.
/* 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
Veya bir istisnayı önlemek için bir deneme yakalama ile çevreleyin.
Bunu File.Move
yapmak için kullanabilirsiniz .
Sadece ekle:
namespace System.IO
{
public static class ExtendedMethod
{
public static void Rename(this FileInfo fileInfo, string newName)
{
fileInfo.MoveTo(fileInfo.Directory.FullName + "\\" + newName);
}
}
}
Ve sonra...
FileInfo file = new FileInfo("c:\test.txt");
file.Rename("test2.txt");
İlk çözüm
System.IO.File.Move
Burada gönderilen çözümlerden kaçının (işaretli cevap dahil). Ağlar üzerinden başarısız olur. Ancak, desen kopyalama / silme yerel olarak ve ağlar üzerinde çalışır. Taşıma çözümlerinden birini uygulayın, ancak bunun yerine Kopyala ile değiştirin. Ardından File.Delete dosyasını kullanarak orijinal dosyayı silin.
Basitleştirmek için bir Yeniden Adlandırma yöntemi oluşturabilirsiniz.
Kullanım kolaylığı
C # 'da VB montaj kullanın. Microsoft.VisualBasic'e başvuru ekleyin
Sonra dosyayı yeniden adlandırmak için:
Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(myfile, newName);
Her ikisi de dizedir. Dosyamın tam yolu olduğunu unutmayın. newName bunu yapmaz. Örneğin:
a = "C:\whatever\a.txt";
b = "b.txt";
Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(a, b);
C:\whatever\
Klasör artık içerecektir b.txt
.
smb
), ftp
, ssh
ya da her türlü şeye sahip komutları / ilkel dosya hareketli için / izin verilmez sürece yeniden adlandırma (örneğin salt okunur).
System.IO.File
Sınıfı kullanarak yeni bir dosya olarak kopyalayabilir ve eskisini silebilirsiniz :
if (File.Exists(oldName))
{
File.Copy(oldName, newName, true);
File.Delete(oldName);
}
NOT: Bu örnek kodda, bir dizin açarız ve dosya adına açık ve kapalı parantezli PDF dosyalarını ararız. İstediğiniz addaki herhangi bir karakteri kontrol edebilir ve değiştirebilir veya yerine koyma işlevlerini kullanarak tamamen yeni bir ad belirleyebilirsiniz.
Daha ayrıntılı yeniden adlandırmalar yapmak için bu koddan çalışmanın başka yolları da var, ancak asıl amacım toplu yeniden adlandırma yapmak için File.Move'un nasıl kullanılacağını göstermekti. Bu, dizüstü bilgisayarımda çalıştırdığımda 180 dizinde 335 PDF dosyasına karşı çalıştı. Bu moment kodunun teşvikidir ve bunu yapmanın daha ayrıntılı yolları vardır.
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();
}
}
}
İnşallah! sizin için yararlı olacaktır. :)
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);
}
}
Bu kod nasıl kullanılır?
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);
}
}
kullanın:
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;
)?
Benim durumumda, yeniden adlandırılan dosyanın adının benzersiz olmasını istiyorum, bu nedenle ada bir tarih-saat damgası ekliyorum. Bu şekilde, 'eski' günlüğün dosya adı her zaman benzersizdir:
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"))));
}
}
Move aynı şeyi yapıyor = Eskisini Kopyala ve Sil.
File.Move(@"C:\ScanPDF\Test.pdf", @"C:\BackupPDF\" + string.Format("backup-{0:yyyy-MM-dd_HH:mm:ss}.pdf",DateTime.Now));
Bana uygun bir yaklaşım bulamadım, bu yüzden versiyonumu öneriyorum. Tabii ki girdi, hata işleme gerekir.
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);
}
}
Ben olay yeniden adlandırıcı da dahil olmak üzere herhangi bir dosya değişikliği için tetikleyen ve dosyayı yeniden adlandırmak sonsuza dek atlamak için, olay işleyicisi içinde dosyayı yeniden adlandırmak zorunda kaldım bir durumla karşılaştım:
File.Copy(fileFullPath, destFileName); // both has the format of "D:\..\..\myFile.ext"
Thread.Sleep(100); // wait OS to unfocus the file
File.Delete(fileFullPath);
Birisinin böyle bir senaryoya sahip olması durumunda;)
int rename(const char * oldname, const char * newname);
rename () işlevi stdio.h başlık dosyasında tanımlanır. Bir dosya veya dizini eski addan yeni ada yeniden adlandırır. Yeniden adlandırma işlemi taşıma ile aynıdır, bu nedenle bir dosyayı taşımak için de bu işlevi kullanabilirsiniz.
C # bazı özelliği olmadığında, C ++ veya C kullanın:
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);
}
}