Come rinominare un file usando C #?
Come rinominare un file usando C #?
Risposte:
Dai un'occhiata a System.IO.File.Move , "sposta" il file con un nuovo nome.
System.IO.File.Move("oldfilename", "newfilename");
System.IO.File.Move(oldNameFullPath, newNameFullPath);
Nel metodo File.Move, questo non sovrascriverà il file se esiste già. E genererà un'eccezione.
Quindi dobbiamo verificare se il file esiste o no.
/* 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
O circondalo con un tentativo di cattura per evitare un'eccezione.
Puoi usarlo File.Move
per farlo.
Aggiungi solo:
namespace System.IO
{
public static class ExtendedMethod
{
public static void Rename(this FileInfo fileInfo, string newName)
{
fileInfo.MoveTo(fileInfo.Directory.FullName + "\\" + newName);
}
}
}
E poi...
FileInfo file = new FileInfo("c:\test.txt");
file.Rename("test2.txt");
Prima soluzione
Evita le System.IO.File.Move
soluzioni pubblicate qui (inclusa la risposta contrassegnata). Fallisce sulle reti. Tuttavia, il modello di copia / eliminazione funziona localmente e sulle reti. Segui una delle soluzioni di spostamento, ma sostituiscila invece con Copia. Quindi utilizzare File.Delete per eliminare il file originale.
È possibile creare un metodo Rinomina per semplificarlo.
Facilità d'uso
Utilizzare l'assembly VB in C #. Aggiungi riferimento a Microsoft.VisualBasic
Quindi per rinominare il file:
Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(myfile, newName);
Entrambi sono stringhe. Si noti che myfile ha il percorso completo. newName no. Per esempio:
a = "C:\whatever\a.txt";
b = "b.txt";
Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(a, b);
La C:\whatever\
cartella conterrà ora b.txt
.
smb
), ftp
, ssh
o qualsiasi altra cosa sono tutte dotate di comandi / primitive per il file in movimento / rinomina a meno che non consentito (ad esempio sola lettura).
Puoi copiarlo come nuovo file e quindi eliminare quello vecchio usando la System.IO.File
classe:
if (File.Exists(oldName))
{
File.Copy(oldName, newName, true);
File.Delete(oldName);
}
NOTA: in questo codice di esempio apriamo una directory e cerchiamo i file PDF con parentesi aperta e chiusa nel nome del file. Puoi controllare e sostituire qualsiasi carattere nel nome che ti piace o semplicemente specificare un nuovo nome utilizzando le funzioni di sostituzione.
Esistono altri modi per lavorare da questo codice per fare rinominazioni più elaborate, ma la mia intenzione principale era mostrare come usare File.Move per rinominare in batch. Questo ha funzionato contro 335 file PDF in 180 directory quando l'ho eseguito sul mio laptop. Questo è lo stimolo del codice del momento e ci sono modi più elaborati per farlo.
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();
}
}
}
Fiduciosamente! sarà utile per te. :)
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);
}
}
Come usare questo codice?
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);
}
}
Uso:
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;
)?
Nel mio caso, voglio che il nome del file rinominato sia univoco, quindi aggiungo un timbro data-ora al nome. In questo modo, il nome file del registro 'vecchio' è sempre unico:
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"))));
}
}
Sposta sta facendo lo stesso = Copia ed Elimina quello vecchio.
File.Move(@"C:\ScanPDF\Test.pdf", @"C:\BackupPDF\" + string.Format("backup-{0:yyyy-MM-dd_HH:mm:ss}.pdf",DateTime.Now));
Non sono riuscito a trovare l'approccio adatto a me, quindi propongo la mia versione. Naturalmente è necessario input, gestione degli errori.
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);
}
}
Ho riscontrato un caso in cui ho dovuto rinominare il file all'interno del gestore eventi, che si stava innescando per qualsiasi modifica del file, incluso rinominare, e per saltare per sempre la ridenominazione del file che ho dovuto rinominare, con:
File.Copy(fileFullPath, destFileName); // both has the format of "D:\..\..\myFile.ext"
Thread.Sleep(100); // wait OS to unfocus the file
File.Delete(fileFullPath);
Nel caso in cui qualcuno, avrà tale scenario;)
int rename(const char * oldname, const char * newname);
La funzione rename () è definita nel file di intestazione stdio.h. Rinomina un file o una directory da oldname a newname. L'operazione di ridenominazione è la stessa di sposta, quindi puoi anche usare questa funzione per spostare un file.
Quando C # non ha alcune funzionalità, utilizzo C ++ o 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);
}
}