.NET Framework
Klasa System.IO.File
Szukaj…
Składnia
- źródło ciągu;
- ciąg znaków;
Parametry
Parametr | Detale |
---|---|
source | Plik, który ma zostać przeniesiony w inne miejsce. |
destination | Katalog, w którym chcesz przenieść source (ta zmienna powinna również zawierać nazwę (i rozszerzenie pliku) pliku. |
Usuń plik
Aby usunąć plik (jeśli masz wymagane uprawnienia), wystarczy:
File.Delete(path);
Jednak wiele rzeczy może się nie powieść:
- Nie masz wymaganych uprawnień (
UnauthorizedAccessException
jestUnauthorizedAccessException
). - Plik może być używany przez kogoś innego (
IOException
zostałIOException
). - Nie można usunąć pliku z powodu błędu niskiego poziomu lub nośnik jest tylko do odczytu (
IOException
jestIOException
). - Plik już nie istnieje (
IOException
jestIOException
).
Pamiętaj, że ostatni punkt (plik nie istnieje) jest zwykle omijany za pomocą fragmentu kodu takiego jak ten:
if (File.Exists(path))
File.Delete(path);
Jednak nie jest to operacja atomowa, a plik może zostać usunięty przez kogoś innego między wywołaniem File.Exists()
a przed File.Delete()
. Właściwe podejście do obsługi operacji we / wy wymaga obsługi wyjątków (przy założeniu, że w przypadku niepowodzenia operacji można zastosować alternatywny przebieg działań):
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
}
}
Należy pamiętać, że te błędy We / Wy czasami mają charakter przejściowy (na przykład plik jest używany), a jeśli dotyczy połączenia sieciowego, może ono zostać automatycznie przywrócone bez żadnych działań z naszej strony. To wtedy wspólne ponowić operację I / O kilka razy z małym opóźnieniem pomiędzy każdą próbę:
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
Uwaga: w środowisku Windows plik nie zostanie tak naprawdę usunięty po wywołaniu tej funkcji, jeśli ktoś inny otworzy plik za pomocą FileShare.Delete
wówczas plik można usunąć, ale stanie się to skutecznie tylko wtedy, gdy właściciel go zamknie.
Usuń niechciane linie z pliku tekstowego
Zmiana pliku tekstowego nie jest łatwa, ponieważ jego zawartość musi być przenoszona. W przypadku małych plików najłatwiejszą metodą jest odczytanie ich zawartości w pamięci, a następnie zapisanie zmodyfikowanego tekstu.
W tym przykładzie czytamy wszystkie linie z pliku i upuszczamy wszystkie puste linie, a następnie piszemy z powrotem do oryginalnej ścieżki:
File.WriteAllLines(path,
File.ReadAllLines(path).Where(x => !String.IsNullOrWhiteSpace(x)));
Jeśli plik jest zbyt duży, aby załadować go do pamięci, a ścieżka wyjściowa jest inna niż ścieżka wejściowa:
File.WriteAllLines(outputPath,
File.ReadLines(inputPath).Where(x => !String.IsNullOrWhiteSpace(x)));
Konwertuj kodowanie plików tekstowych
Tekst jest zapisywany w postaci zakodowanej (patrz także temat Ciągi ), a czasem może być konieczna zmiana jego kodowania, w tym przykładzie założono (dla uproszczenia), że plik nie jest zbyt duży i można go całkowicie odczytać z pamięci:
public static void ConvertEncoding(string path, Encoding from, Encoding to)
{
File.WriteAllText(path, File.ReadAllText(path, from), to);
}
Podczas wykonywania konwersji nie zapomnij, że plik może zawierać BOM (Byte Order Mark), aby lepiej zrozumieć, w jaki sposób jest zarządzany, zapoznaj się z Encoding.UTF8.GetString nie bierze pod uwagę Preambuły / BOM .
„Dotknij” dużej ilości plików (aby zaktualizować czas ostatniego zapisu)
Ten przykład aktualizuje czas ostatniego zapisu ogromnej liczby plików (przy użyciu System.IO.Directory.EnumerateFiles
zamiast System.IO.Directory.GetFiles()
). Opcjonalnie możesz określić wzorzec wyszukiwania (domyślnie jest to "*.*"
I ewentualnie przeszukać drzewo katalogów (nie tylko określony katalog):
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);
}
}
Wylicz pliki starsze niż określona ilość
Ten fragment kodu jest funkcją pomocniczą do wyliczenia wszystkich plików starszych niż określony wiek, jest przydatny - na przykład - gdy musisz usunąć stare pliki dziennika lub stare dane z pamięci podręcznej.
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);
}
Używany w ten sposób:
var oldFiles = EnumerateAllFilesOlderThan(TimeSpan.FromDays(7), @"c:\log", "*.log");
Kilka rzeczy do zapamiętania:
- Wyszukiwanie odbywa się za pomocą
Directory.EnumerateFiles()
zamiastDirectory.GetFiles()
. Wyliczenie jest aktywne , nie trzeba czekać, aż wszystkie wpisy systemu plików zostaną pobrane. - Sprawdzamy czas ostatniego zapisu, ale możesz użyć czasu utworzenia lub ostatniego dostępu (na przykład, aby usunąć nieużywane pliki z pamięci podręcznej, pamiętaj, że czas dostępu może być wyłączony).
- Granulacja nie jest jednolita dla wszystkich tych właściwości (czas zapisu, czas dostępu, czas tworzenia), sprawdź MSDN, aby uzyskać szczegółowe informacje na ten temat.
Przenieś plik z jednej lokalizacji do drugiej
File.Move
Aby przenieść plik z jednej lokalizacji do drugiej, jeden prosty wiersz kodu może to osiągnąć: File.Move(@"C:\TemporaryFile.txt", @"C:\TemporaryFiles\TemporaryFile.txt");
Jest jednak wiele rzeczy, które mogą się nie udać dzięki tej prostej operacji. Co na przykład, jeśli użytkownik uruchamiający program nie ma Dysku oznaczonego „C”? Co jeśli tak, ale postanowili zmienić nazwę na „B” lub „M”?
Co jeśli plik źródłowy (plik, w którym chcesz się przenieść) został przeniesiony bez Twojej wiedzy - lub co jeśli po prostu nie istnieje.
Można to obejść, sprawdzając najpierw, czy plik źródłowy istnieje:
string source = @"C:\TemporaryFile.txt", destination = @"C:\TemporaryFiles\TemporaryFile.txt";
if(File.Exists("C:\TemporaryFile.txt"))
{
File.Move(source, destination);
}
Zapewni to, że w tym momencie plik istnieje i można go przenieść w inne miejsce. Może się zdarzyć, że zwykłe wywołanie File.Exists
nie wystarczy. Jeśli tak nie jest, sprawdź ponownie, przekaż użytkownikowi, że operacja się nie powiodła - lub obsłuż wyjątek.
FileNotFoundException
to nie jedyny wyjątek, który możesz napotkać.
Poniżej możliwe możliwe wyjątki:
Rodzaj wyjątku | Opis |
---|---|
IOException | Plik już istnieje lub nie można znaleźć pliku źródłowego. |
ArgumentNullException | Wartość parametrów Source i / lub Destination jest zerowa. |
ArgumentException | Wartość parametrów Source i / lub Destination jest pusta lub zawiera nieprawidłowe znaki. |
UnauthorizedAccessException | Nie masz wymaganych uprawnień, aby wykonać tę akcję. |
PathTooLongException | Źródło, miejsce docelowe lub określone ścieżki przekraczają maksymalną długość. W systemie Windows długość ścieżki musi być mniejsza niż 248 znaków, a nazwy plików muszą być mniejsze niż 260 znaków. |
DirectoryNotFoundException | Nie można znaleźć określonego katalogu. |
NotSupportedException | Ścieżki źródłowe lub docelowe lub nazwy plików mają niepoprawny format. |