Czy istnieje sposób na sprawdzenie, czy plik jest już otwarty, czy nie?Sprawdź, czy plik jest otwarty.
Odpowiedz
protected virtual bool IsFileinUse(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
return false;
}
Jeśli proces nie ma prawa zapisu do pliku, spowoduje to wprowadzający w błąd wynik (otwarcie nie powiedzie się, ale niekoniecznie z powodu istniejącego uchwytu). Otwarcie dostępu do odczytu byłoby mniej podatne na błędy. – hemp
To niesamowite, że większość języków nie ma metody, aby przetestować plik jest otwarty. Użyliśmy tego samego typu metody w C++ w OS/2. tj. spróbuj otworzyć plik wyłączny. Działa to wystarczająco dobrze, ale nigdy nie uważałem tego za eleganckie. – Matt
Nie jest to funkcja językowa, jest to funkcja systemu operacyjnego. Po prostu nie istnieje prosty interfejs API (w systemie Windows), aby wyszukiwać te informacje. Możliwe jest uzyskanie, ale jest niski poziom i istnieje wiele parametrów, które trzeba określić, aby wiedzieć, co oznaczało "otwarte". – hemp
Jak @pranay rana, ale musimy mieć pewność, że zamykamy uchwyt pliku:
public bool IsFileInUse(string path)
{
if (string.IsNullOrEmpty(path))
throw new ArgumentException("'path' cannot be null or empty.", "path");
try {
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { }
} catch (IOException) {
return true;
}
return false;
}
To samo co @pranay rana, testowałem tę metodę, ale nie wykrywa, kiedy plik jest otwarty w Notatniku . – James
Jeśli masz na myśli, że chcesz sprawdzić, czy plik jest otwarty, zanim spróbujesz go otworzyć , w takim razie nie. (Przynajmniej nie przechodząc na niski poziom i sprawdź każdy uchwyt pliku otwarty w systemie.)
Poza tym informacje będą stare, gdy je otrzymasz. Nawet jeśli test zwróci, że plik nie jest otwarty, mógł zostać otwarty, zanim będziesz mógł skorzystać z wartości zwracanej.
Tak więc właściwym sposobem poradzenia sobie z tą sytuacją jest próba otwarcia pliku i radzenia sobie z każdym błędem, który może wystąpić.
Uzgodnione. Chciałbym utworzyć wyznaczoną klasę, która otacza logikę otwartego pliku lub przynajmniej test (IsFileAvailable). Umożliwi to umieszczenie zarządzania wyjątkami w klasie, która jest szczególnie odpowiedzialna i sprawi, że będzie można ją ponownie użyć. Możesz nawet zastosować dalszą logikę, na przykład testowanie rozmiaru pliku, aby sprawdzić, czy plik jest zapisywany w itd., Aby uzyskać bardziej szczegółową odpowiedź. Dzięki temu twój konsumujący kod będzie znacznie czystszy.
Proszę podać więcej szczegółów. Jesteś już otwarty przez proces lub inny proces? Otwarty okres, lub po prostu otwarty z prawem do zapisu? A co z udostępnianiem? itp. To pytanie jest zbyt ogólnikowe. – hemp