.NET Framework
System.IO.File-Klasse
Suche…
Syntax
- String-Quelle;
- String Ziel;
Parameter
Parameter | Einzelheiten |
---|---|
source | Die Datei, die an einen anderen Speicherort verschoben werden soll. |
destination | Das Verzeichnis, in das Sie source verschieben möchten (diese Variable sollte auch den Namen (und die Dateierweiterung) der Datei enthalten |
Datei löschen
So löschen Sie eine Datei (wenn Sie über die erforderlichen Berechtigungen verfügen) ist so einfach wie folgt:
File.Delete(path);
Es können jedoch viele Dinge schief gehen:
- Sie haben keine erforderlichen Berechtigungen (
UnauthorizedAccessException
wird ausgelöst). - Die Datei wird möglicherweise von einer anderen Person verwendet (
IOException
wird ausgelöst). - Datei kann nicht gelöscht werden, da ein Fehler auf niedriger Ebene vorliegt oder das Medium
IOException
ist (IOException
wird ausgelöst). - Datei existiert nicht mehr (
IOException
wird ausgelöst).
Beachten Sie, dass der letzte Punkt (Datei nicht vorhanden) normalerweise mit einem Code-Snippet wie folgt umgangen wird :
if (File.Exists(path))
File.Delete(path);
Es handelt sich jedoch nicht um eine atomare Operation, und die Datei kann von einer anderen Person zwischen dem Aufruf von File.Exists()
und vor File.Delete()
. Der richtige Ansatz für die Verarbeitung von E / A-Vorgängen erfordert die Ausnahmebehandlung (vorausgesetzt, bei einem Fehlschlagen des Vorgangs kann ein alternativer Ablauf von Maßnahmen ergriffen werden):
if (File.Exists(path))
{
try
{
File.Delete(path);
}
catch (IOException exception)
{
if (!File.Exists(path))
return; // Someone else deleted this file
// Something went wrong...
}
catch (UnauthorizedAccessException exception)
{
// I do not have required permissions
}
}
Beachten Sie, dass diese E / A-Fehler manchmal vorübergehend sind (z. B. verwendete Datei). Wenn eine Netzwerkverbindung beteiligt ist, wird sie möglicherweise automatisch wiederhergestellt, ohne dass von unserer Seite etwas unternommen wird. Es ist üblich, eine E / A-Operation einige Male mit einer kleinen Verzögerung zwischen den einzelnen Versuchen zu wiederholen :
public static void Delete(string path)
{
if (!File.Exists(path))
return;
for (int i=1; ; ++i)
{
try
{
File.Delete(path);
return;
}
catch (IOException e)
{
if (!File.Exists(path))
return;
if (i == NumberOfAttempts)
throw;
Thread.Sleep(DelayBetweenEachAttempt);
}
// You may handle UnauthorizedAccessException but this issue
// will probably won't be fixed in few seconds...
}
}
private const int NumberOfAttempts = 3;
private const int DelayBetweenEachAttempt = 1000; // ms
Hinweis: Wenn Sie diese Funktion aufrufen, wird die Datei in der Windows-Umgebung nicht wirklich gelöscht. Wenn eine andere Person die Datei mit FileShare.Delete
öffnet, kann die Datei gelöscht werden. FileShare.Delete
geschieht jedoch nur, wenn der Eigentümer die Datei schließt.
Entfernen Sie unerwünschte Zeilen aus einer Textdatei
Eine Textdatei zu ändern ist nicht einfach, da der Inhalt verschoben werden muss. Für kleine Dateien ist die einfachste Methode, den Inhalt in den Speicher zu lesen und dann den geänderten Text zurückzuschreiben.
In diesem Beispiel lesen wir alle Zeilen aus einer Datei und löschen alle leeren Zeilen und schreiben dann in den ursprünglichen Pfad zurück:
File.WriteAllLines(path,
File.ReadAllLines(path).Where(x => !String.IsNullOrWhiteSpace(x)));
Wenn die Datei zu groß ist, um sie in den Speicher zu laden, unterscheidet sich der Ausgabepfad vom Eingabepfad:
File.WriteAllLines(outputPath,
File.ReadLines(inputPath).Where(x => !String.IsNullOrWhiteSpace(x)));
Konvertieren Sie die Kodierung der Textdatei
Text wird verschlüsselt gespeichert (siehe auch Strings- Thema). In einigen Fällen müssen Sie möglicherweise die Codierung ändern. In diesem Beispiel wird (zur Vereinfachung) davon ausgegangen, dass die Datei nicht zu groß ist und vollständig im Speicher gelesen werden kann:
public static void ConvertEncoding(string path, Encoding from, Encoding to)
{
File.WriteAllText(path, File.ReadAllText(path, from), to);
}
Vergessen Sie bei Konvertierungen nicht, dass die Datei möglicherweise BOM (Byte Order Mark) enthält, um besser zu verstehen, wie sie verwaltet wird, lesen Sie Encoding.UTF8.GetString berücksichtigt nicht die Präambel / BOM .
"Berühren" Sie eine große Anzahl von Dateien (um die letzte Schreibzeit zu aktualisieren)
In diesem Beispiel wird das letzte Schreiben einer großen Anzahl von Dateien System.IO.Directory.EnumerateFiles
(mithilfe von System.IO.Directory.EnumerateFiles
anstelle von System.IO.Directory.GetFiles()
). Optional können Sie ein Suchmuster angeben (standardmäßig "*.*"
Und schließlich eine Verzeichnisstruktur durchsuchen (nicht nur das angegebene Verzeichnis):
public static void Touch(string path,
string searchPattern = "*.*",
SearchOptions options = SearchOptions.None)
{
var now = DateTime.Now;
foreach (var filePath in Directory.EnumerateFiles(path, searchPattern, options))
{
File.SetLastWriteTime(filePath, now);
}
}
Aufzählen von Dateien, die älter als eine angegebene Anzahl sind
Dieses Snippet ist eine Hilfsfunktion zum Auflisten aller Dateien, die älter als ein bestimmtes Alter sind. Dies ist beispielsweise nützlich, wenn Sie alte Protokolldateien oder alte zwischengespeicherte Daten löschen müssen.
static IEnumerable<string> EnumerateAllFilesOlderThan(
TimeSpan maximumAge,
string path,
string searchPattern = "*.*",
SearchOption options = SearchOption.TopDirectoryOnly)
{
DateTime oldestWriteTime = DateTime.Now - maximumAge;
return Directory.EnumerateFiles(path, searchPattern, options)
.Where(x => Directory.GetLastWriteTime(x) < oldestWriteTime);
}
So benutzt:
var oldFiles = EnumerateAllFilesOlderThan(TimeSpan.FromDays(7), @"c:\log", "*.log");
Einige Dinge zu beachten:
- Die Suche wird mit
Directory.EnumerateFiles()
anstelle vonDirectory.GetFiles()
. Die Aufzählung ist lebendig, dann müssen Sie nicht warten, bis alle Dateisystemeinträge abgerufen wurden. - Wir prüfen die letzte Schreibzeit, aber Sie können die Erstellungszeit oder die letzte Zugriffszeit verwenden (z. B. zum Löschen nicht verwendeter zwischengespeicherter Dateien, dass die Zugriffszeit deaktiviert ist).
- Die Granularität ist für alle diese Eigenschaften nicht einheitlich (Schreibzeit, Zugriffszeit, Erstellungszeit). Weitere Informationen hierzu finden Sie in MSDN.
Verschieben Sie eine Datei von einem Ort an einen anderen
File.Move
Um eine Datei von einem Ort an einen anderen zu verschieben, kann dies mit einer einfachen Codezeile erreicht werden: File.Move(@"C:\TemporaryFile.txt", @"C:\TemporaryFiles\TemporaryFile.txt");
Es gibt jedoch viele Dinge, die bei dieser einfachen Operation schief gehen könnten. Was passiert beispielsweise, wenn der Benutzer, der Ihr Programm ausführt, kein Laufwerk mit der Bezeichnung 'C' hat? Was wäre, wenn sie es taten - aber sie beschlossen, es in 'B' oder 'M' umzubenennen?
Was ist, wenn die Quelldatei (die Datei, in die Sie verschieben möchten) ohne Ihr Wissen verschoben wurde - oder wenn es einfach nicht existiert?
Dies kann umgangen werden, indem zunächst geprüft wird, ob die Quelldatei vorhanden ist:
string source = @"C:\TemporaryFile.txt", destination = @"C:\TemporaryFiles\TemporaryFile.txt";
if(File.Exists("C:\TemporaryFile.txt"))
{
File.Move(source, destination);
}
Dadurch wird sichergestellt, dass die Datei zu diesem Zeitpunkt existiert und an einen anderen Ort verschoben werden kann. Es kann vorkommen, dass ein einfacher Aufruf von File.Exists
nicht ausreicht. Ist dies nicht der Fall, überprüfen Sie erneut, teilen Sie dem Benutzer mit, dass die Operation fehlgeschlagen ist, oder behandeln Sie die Ausnahme.
Eine FileNotFoundException
ist nicht die einzige Ausnahme, der Sie wahrscheinlich begegnen.
Nachfolgend finden Sie mögliche Ausnahmen:
Ausnahmetyp | Beschreibung |
---|---|
IOException | Die Datei ist bereits vorhanden oder die Quelldatei wurde nicht gefunden. |
ArgumentNullException | Der Wert der Source- und / oder Destination-Parameter ist null. |
ArgumentException | Der Wert der Source- und / oder Destination-Parameter ist leer oder enthält ungültige Zeichen. |
UnauthorizedAccessException | Sie haben nicht die erforderlichen Berechtigungen, um diese Aktion auszuführen. |
PathTooLongException | Quelle, Ziel oder angegebene Pfade überschreiten die maximale Länge. Unter Windows muss die Länge eines Pfads weniger als 248 Zeichen betragen, während Dateinamen weniger als 260 Zeichen umfassen dürfen. |
DirectoryNotFoundException | Das angegebene Verzeichnis wurde nicht gefunden. |
NotSupportedException | Die Quell- oder Zielpfade oder Dateinamen weisen ein ungültiges Format auf. |