Ich würde gerne hinzufügen, dass es hier ein Problem mit allen Lösungen gibt, insbesondere wenn Sie die Datei vergleichen und von einem Speicherort an einen anderen verschieben (Verzeichnis sowie Dateiname), sofern Sie sich darüber im Klaren sein sollten, dass ein Volume ein sein könnte Knotenpunkt ... Wenn also der neue Name q: \ SomeJunctionDirectory \ hello.txt und der alte Name c: \ TargetOfJunctionPoint \ hello.txt lautet ... sind die Dateien identisch, die Namen jedoch nicht.
Adrian Hum
Antworten:
966
Schauen Sie sich System.IO.File.Move an und verschieben Sie die Datei unter einem neuen Namen.
Diese Lösung funktioniert nicht, wenn sich Dateinamen nur in Groß- und Kleinschreibung unterscheiden. Zum Beispiel file.txt und File.txt
SepehrM
2
@SepehrM, ich habe es nur noch einmal überprüft und es funktioniert gut auf meinem Windows 8.1-Computer.
Chris Taylor
1
@SepehrM, ich habe es nicht getestet, aber die Beispiele, auf die Sie verweisen, verwenden FileInfo.Move und nicht File.Move. Vielleicht hat das etwas damit zu tun?
Chris Taylor
2
@SepehrM Windows-Dateisystemnamen unterscheiden nicht zwischen Groß- und Kleinschreibung. File.txt und file.txt werden als der gleiche Dateiname behandelt. Daher ist mir nicht klar, wann Sie sagen, dass die Lösung nicht funktioniert. Was machst du genau das funktioniert nicht?
Michael
4
@Michael, das Dateisystem unterscheidet nicht zwischen Groß- und Kleinschreibung, speichert jedoch den Dateinamen im ursprünglichen Fall, wie vom Benutzer eingegeben. In SepehrMs Fall versuchte er, den Fall einer Datei zu ändern, was aus irgendeinem Grund nicht funktionierte. Das Matching ohne Berücksichtigung der Groß- und Kleinschreibung funktionierte. HTH
In der File.Move-Methode wird die Datei dadurch nicht überschrieben, wenn sie bereits vorhanden ist. Und es wird eine Ausnahme auslösen.
Wir müssen also prüfen, ob die Datei existiert oder nicht.
/* 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
Oder umgeben Sie es mit einem Try-Catch, um eine Ausnahme zu vermeiden.
Seien Sie bei diesem Ansatz sehr vorsichtig. Wenn Ihr Zielverzeichnis und Ihr Quellverzeichnis identisch sind und der "neue Name" tatsächlich eine zwischen Groß- und Kleinschreibung unterscheidende Version von "oldFileName" ist, werden Sie löschen, bevor Sie die Möglichkeit haben, Ihre Datei zu verschieben.
Adrian Hum
1
Sie können die Zeichenfolgen auch nicht einfach auf Gleichheit überprüfen, da es verschiedene Möglichkeiten gibt, einen einzelnen Dateipfad darzustellen.
Drew Noakes
File.Move verfügt jetzt über eine Überladungsmethode, mit der Sie die Datei überschreiben können - File.Move (oldPath, newPath, true)
eww ... Verwenden Sie Path.Combine (), anstatt die Datei zusammenzustellen.
Adrian Hum
20
Erste Lösung
Vermeiden Sie hier veröffentlichte System.IO.File.MoveLösungen (markierte Antwort enthalten). Es fällt über Netzwerke aus. Das Kopieren / Löschen von Mustern funktioniert jedoch lokal und über Netzwerke. Befolgen Sie eine der Verschiebungslösungen, ersetzen Sie sie jedoch stattdessen durch Kopieren. Verwenden Sie dann File.Delete, um die Originaldatei zu löschen.
Sie können eine Umbenennungsmethode erstellen, um sie zu vereinfachen.
Benutzerfreundlichkeit
Verwenden Sie die VB-Assembly in C #. Verweis auf Microsoft.VisualBasic hinzufügen
Damit Sie wissen, ruft Microsoft.VisualBasic.FileIO.FileSystem.RenameFile File.Move auf. Andere bedanken sich für die Normalisierung der Originaldatei und einige zusätzliche Fehlerprüfungen für die Argumente, z. Datei existiert, Dateiname nicht null usw. Dann wird File.Move aufgerufen.
Chris Taylor
Wenn Copy () nicht alle Dateistreams kopiert, von denen ich annehme, dass dies nicht der Fall ist, würde ich die Verwendung von delete / copy vermeiden. Ich gehe davon aus, dass Move (), zumindest wenn Sie im selben Dateisystem bleiben, einfach umbenannt wird und somit alle Dateistreams beibehalten werden.
Nickdu
"Es schlägt über das Netzwerk fehl", dann werden Sie kopieren und löschen, was tatsächlich heruntergeladen und hochgeladen wird, nur um die Code-Zeit zu vereinfachen ... Welche Art von Netzwerk? Windows freigegebenen Ordner ( smb) ftp, sshoder was auch immer alle haben Befehle / Primitive für Datei Bewegt- / Umbenennen , es sei denn nicht zulässig (zB read-only).
Meow Cat 2012
16
Sie können es als neue Datei kopieren und dann die alte mit der System.IO.FileKlasse löschen :
Hinweis für alle, die dies lesen: Dies ist ein Anti-Pattern. Die Datei wird möglicherweise von einem anderen Prozess oder dem Betriebssystem zwischen der Überprüfung, ob sie vorhanden ist, und Ihrem Aufruf zum Kopieren gelöscht oder umbenannt. Sie müssen stattdessen einen Try-Catch verwenden.
user9993
Wenn das Volume gleich ist, ist dies auch eine enorme Verschwendung von E / A, da ein Verschieben tatsächlich eine Umbenennung auf Verzeichnisinformationsebene bewirken würde.
Adrian Hum
Ich verarbeite Tausende von Dateien und habe den Eindruck, dass Kopieren / Löschen schneller ist als Verschieben.
Roberto
Wie würde jemand auf eine solche Idee kommen? Schneller oder nicht, zumindest ermorden Sie die Festplatte. Wenn Sie in der Frage "umbenennen" sagen, bedeutet dies, dass Sie lokal umbenennen müssen, was natürlich keine partitionübergreifende Verschiebung beinhaltet.
Meow Cat 2012
Mit File.Move bin ich auf UnauthorizedAccessException gestoßen, aber diese Sequenz von Kopieren und Löschen hat funktioniert. Vielen Dank!
Oliver König
6
HINWEIS: In diesem Beispielcode öffnen wir ein Verzeichnis und suchen nach PDF-Dateien mit offener und geschlossener Klammer im Namen der Datei. Sie können jedes Zeichen im gewünschten Namen überprüfen und ersetzen oder einfach einen ganz neuen Namen mit den Ersetzungsfunktionen angeben.
Es gibt andere Möglichkeiten, mit diesem Code zu arbeiten, um aufwändigere Umbenennungen durchzuführen. Meine Hauptabsicht war jedoch, zu zeigen, wie File.Move zum Umbenennen von Stapeln verwendet wird. Dies funktionierte gegen 335 PDF-Dateien in 180 Verzeichnissen, als ich es auf meinem Laptop ausführte. Dies ist spontaner Code, und es gibt ausgefeiltere Möglichkeiten, dies zu tun.
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();}}}
Das ist ... völlig nebensächlich, auf eine Frage, die genau auf den Punkt vor 3 Jahren beantwortet wurde.
Nyerguds
2
Es ist ein gültiges Beispiel. Overkill vielleicht, aber nicht nebensächlich. +1
Adam
1
@Adam: Es ist eine sehr spezifische Implementierung genau der Antwort, die bereits drei Jahre zuvor gegeben wurde, auf eine Frage, bei der es überhaupt nicht um eine spezifische Implementierung ging. Sehen Sie nicht, wie konstruktiv das ist.
Nyerguds
@Nyerguds dann haben wir verschiedene Definitionen von "neben dem Punkt", was nicht überraschend ist, da es ein subjektiver Begriff ist.
Adam
@Nyerguds wenn es für dich irrelevant ist, dann ist das in Ordnung. Einige Leute mögen Ausführlichkeit, weil es ihnen hilft, "reale" Implementierungen von "Beispiel- / Beispiel" -Code zu finden. Es benennt Datei (en) um. Wie es nebensächlich ist, ist ziemlich genau wie Adam sagte, es ist subjektiv. Aus irgendeinem Grund empfinden Sie es als absolut objektiv. Na ja, jedem sein eigenes. Vielen Dank für die Eingabe.
MicRoc
6
Hoffnungsvoll! es wird für Sie hilfreich sein. :) :)
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);}}
Wie benutze ich diesen Code?
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);
Wenn Sie dies tun, würde ich vorschlagen, zu überprüfen, ob der 'oldFilePath' vorhanden ist, bevor Sie etwas tun ... oder Sie löschen den 'newFilePath' ohne Grund.
John Kroetch
Kompiliert das überhaupt ( Using System.IO;)?
Peter Mortensen
3
In meinem Fall möchte ich, dass der Name der umbenannten Datei eindeutig ist, daher füge ich dem Namen einen Datums- / Zeitstempel hinzu. Auf diese Weise ist der Dateiname des 'alten' Protokolls immer eindeutig:
Ich bin auf einen Fall gestoßen, in dem ich die Datei im Ereignishandler umbenennen musste, der für jede Dateiänderung, einschließlich Umbenennen, ausgelöst wurde, und um das Umbenennen der Datei für immer zu überspringen, musste ich sie umbenennen, mit:
Kopie erstellen
Original entfernen
File.Copy(fileFullPath, destFileName);// both has the format of "D:\..\..\myFile.ext"Thread.Sleep(100);// wait OS to unfocus the file File.Delete(fileFullPath);
Nur für den Fall, dass jemand ein solches Szenario hat;)
int rename(constchar* oldname,constchar* newname);
Die Funktion rename () ist in der Header-Datei stdio.h definiert. Es benennt eine Datei oder ein Verzeichnis von altem Namen in neuen Namen um. Der Umbenennungsvorgang entspricht dem Verschieben. Daher können Sie diese Funktion auch zum Verschieben einer Datei verwenden.
Herzlich willkommen. Bei dieser Frage geht es darum, eine Datei in der Sprache C # umzubenennen. Ich bin mir nicht sicher, wie es hier hilft, auf etwas aus der Standardbibliothek von C (nicht C #) hinzuweisen.
Jeff Dammeyer
-10
Wenn C # keine Funktion hat, verwende ich C ++ oder 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);}}
Antworten:
Schauen Sie sich System.IO.File.Move an und verschieben Sie die Datei unter einem neuen Namen.
quelle
quelle
In der File.Move-Methode wird die Datei dadurch nicht überschrieben, wenn sie bereits vorhanden ist. Und es wird eine Ausnahme auslösen.
Wir müssen also prüfen, ob die Datei existiert oder nicht.
Oder umgeben Sie es mit einem Try-Catch, um eine Ausnahme zu vermeiden.
quelle
Sie können es verwenden
File.Move
, um es zu tun.quelle
Einfach hinzufügen:
Und dann...
quelle
Erste Lösung
Vermeiden Sie hier veröffentlichte
System.IO.File.Move
Lösungen (markierte Antwort enthalten). Es fällt über Netzwerke aus. Das Kopieren / Löschen von Mustern funktioniert jedoch lokal und über Netzwerke. Befolgen Sie eine der Verschiebungslösungen, ersetzen Sie sie jedoch stattdessen durch Kopieren. Verwenden Sie dann File.Delete, um die Originaldatei zu löschen.Sie können eine Umbenennungsmethode erstellen, um sie zu vereinfachen.
Benutzerfreundlichkeit
Verwenden Sie die VB-Assembly in C #. Verweis auf Microsoft.VisualBasic hinzufügen
Um die Datei dann umzubenennen:
Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(myfile, newName);
Beide sind Saiten. Beachten Sie, dass myfile den vollständigen Pfad hat. newName nicht. Zum Beispiel:
Der
C:\whatever\
Ordner enthält jetztb.txt
.quelle
smb
)ftp
,ssh
oder was auch immer alle haben Befehle / Primitive für Datei Bewegt- / Umbenennen , es sei denn nicht zulässig (zB read-only).Sie können es als neue Datei kopieren und dann die alte mit der
System.IO.File
Klasse löschen :quelle
HINWEIS: In diesem Beispielcode öffnen wir ein Verzeichnis und suchen nach PDF-Dateien mit offener und geschlossener Klammer im Namen der Datei. Sie können jedes Zeichen im gewünschten Namen überprüfen und ersetzen oder einfach einen ganz neuen Namen mit den Ersetzungsfunktionen angeben.
Es gibt andere Möglichkeiten, mit diesem Code zu arbeiten, um aufwändigere Umbenennungen durchzuführen. Meine Hauptabsicht war jedoch, zu zeigen, wie File.Move zum Umbenennen von Stapeln verwendet wird. Dies funktionierte gegen 335 PDF-Dateien in 180 Verzeichnissen, als ich es auf meinem Laptop ausführte. Dies ist spontaner Code, und es gibt ausgefeiltere Möglichkeiten, dies zu tun.
quelle
Wie benutze ich diesen Code?
quelle
Verwenden:
quelle
Using System.IO;
)?In meinem Fall möchte ich, dass der Name der umbenannten Datei eindeutig ist, daher füge ich dem Namen einen Datums- / Zeitstempel hinzu. Auf diese Weise ist der Dateiname des 'alten' Protokolls immer eindeutig:
quelle
Verschieben macht dasselbe = Altes kopieren und löschen.
quelle
Ich konnte keinen Ansatz finden, der zu mir passt, also schlage ich meine Version vor. Natürlich brauchen Eingabe, Fehlerbehandlung.
quelle
quelle
Ich bin auf einen Fall gestoßen, in dem ich die Datei im Ereignishandler umbenennen musste, der für jede Dateiänderung, einschließlich Umbenennen, ausgelöst wurde, und um das Umbenennen der Datei für immer zu überspringen, musste ich sie umbenennen, mit:
Nur für den Fall, dass jemand ein solches Szenario hat;)
quelle
Die Funktion rename () ist in der Header-Datei stdio.h definiert. Es benennt eine Datei oder ein Verzeichnis von altem Namen in neuen Namen um. Der Umbenennungsvorgang entspricht dem Verschieben. Daher können Sie diese Funktion auch zum Verschieben einer Datei verwenden.
quelle
Wenn C # keine Funktion hat, verwende ich C ++ oder C:
quelle