Mam deskryptor pliku, który jest ustawiony na wartość dodatnią z wynikiem funkcji open(), więc ten fd wskazuje plik. Kiedy usuwam rzeczywisty plik fd jest nadal dodatnią liczbą całkowitą. Chcę wiedzieć, że jeśli usunę jakiś plik z jakiegoś powodu, to skąd mogę wiedzieć, że ten deskryptor pliku nie jest już prawidłowy. W skrócie, skąd mogę wiedzieć, że plik, który pokazuje fd, nadal tam jest. Próbuję to zrobić w C na FreeBSD.Jak sprawdzić, czy plik nadal istnieje przy użyciu deskryptora pliku
Odpowiedz
Systemy uniksowe umożliwiają usuwanie otwartych plików (lub raczej usuwanie wszystkich odniesień do pliku z systemu plików). Ale deskryptor pliku jest nadal ważny nadal ważny. Wszelkie połączenia do odczytu i zapisu będą udane, tak jak w przypadku nazwy pliku.
Innymi słowy, nie można całkowicie usunąć pliku, dopóki deskryptor pliku nie zostanie zamknięty. Po zamknięciu plik zostanie automatycznie usunięty.
Przy użyciu prawidłowego deskryptora pliku można sprawdzić, czy nazwa pliku nadal istnieje, np.
printf("%d\n", buf.st_nlink); // 0 means no filenames
Gdzie buf
jest struct stat
zainicjowane fstat
.
Dzięki za poradę, ale to inna sytuacja, z którą się spotykam. Muszę tylko sprawdzić, czy plik, który pokazuje fd, nadal tam jest. Jeśli nie, to w jaki sposób nauczyć się tego poprzez fd? –
@HasanBozok - Możesz użyć 'fstat' na poprawnym deskryptorze pliku, aby uzyskać liczbę twardych linków. Jeśli wynosi 0, nazwy plików zostały usunięte. – teppic
@teppic, Czy istnieje sposób, aby [nazwa pliku ioctl] (http://pubs.opengroup.org/onlinepubs/009696699/functions/ioctl.html) rzeczywiście spowodował usunięcie pliku? Gdyby to było możliwe, byłoby to niebezpieczne? –
Przed zapisaniem do pliku można sprawdzić, czy jest tam jeszcze użyciu access()
if (access("/yourfile",W_OK)!=-1) {
//Write on the file
}
można też zrobić fstat na Eurovoc:
struct stat statbuf;
fstat(fd,&statbuf);
if (statbuf.st_nlink > 0) {
//File still exists
}
Ale będzie to spowolnić swoje oprogramowanie w dół wiele, a także jakiś program może połączyć plik gdzie indziej i odłączyć oryginalną nazwę, aby plik nadal istniał, ale pod inną nazwą/lokalizacją, a ta metoda nie wykryłaby tego.
Znacznie lepszą alternatywą byłoby użycie inotify
na GNU/Linux lub kqueue na bsd, ale nigdy nie korzystałem z drugiej.
Możesz używać tych interfejsów API do oglądania zmian w katalogach i otrzymywania powiadomień z jądra oraz pobierania zdarzenia, gdy twój plik jest usuwany przez jakiś inny proces, i zrób coś z tym.
Należy pamiętać, że zdarzenia te nie są wykonywane w czasie rzeczywistym, więc można nadal używać pliku przez kilka milisekund przed jego uzyskaniem.
- 1. Jak sprawdzić, czy istnieje katalog zawierający plik?
- 2. Jak sprawdzić, czy zestaw ALA nadal istnieje przy użyciu adresu URL?
- 3. Jak sprawdzić, czy plik jest zaszyfrowany przy użyciu AES (Rijndael)?
- 4. jak sprawdzić, czy plik jest wybrany przy użyciu javascript?
- 5. Jak sprawdzić, czy element istnieje w DOM przy użyciu jQuery?
- 6. Jak sprawdzić, czy istnieje dokument couchdb przy użyciu pythona
- 7. Jak sprawdzić, czy katalog istnieje przy użyciu C++ i WinAPI
- 8. Jak sprawdzić, czy kolejka JMS istnieje przy użyciu języka Java?
- 9. Delphi: jak sprawdzić, czy plik istnieje (ścieżka powyżej 255 znaków)
- 10. Jak sprawdzić, czy plik istnieje w pilocie?
- 11. Jak sprawdzić, czy plik istnieje w ansibla?
- 12. Jak najlepiej sprawdzić, czy plik cookie istnieje?
- 13. przy użyciu stat, aby wykryć, czy plik istnieje (wolno?)
- 14. Webdriver - Jak sprawdzić, czy przeglądarka nadal istnieje czy nadal jest otwarta?
- 15. Jak sprawdzić, czy plik istnieje w aplikacji WindowsStore
- 16. Nauka COM nadal przy użyciu?
- 17. Jak sprawdzić, czy plik istnieje w C#/.NET?
- 18. Jak uzyskać deskryptor pliku w pliku node.js, jeśli otworzysz plik przy użyciu openSync
- 19. Czy "elseif" nadal istnieje?
- 20. jak sprawdzić, czy 2 pliki są równe przy użyciu .NET?
- 21. nazywając fdopen: Bad plik deskryptora
- 22. Jak sprawdzić, czy plik zasobów istnieje w Javie?
- 23. jak sprawdzić, czy istnieje stała w php
- 24. Jak sprawdzić, czy plik istnieje w katalogu Dokumenty w Swift?
- 25. Jak sprawdzić, czy plik jest skompresowany gzip?
- 26. Jak sprawdzić, czy System.IO.File.Delete usunięty plik z powodzeniem
- 27. Jak sprawdzić, czy plik lub katalog istnieje bez użycia fs.ist?
- 28. Jak sprawdzić, czy jest nadal w trybie powłoki Vima
- 29. Jak uzyskać strumień FILE * z deskryptora pliku?
- 30. Jak sprawdzić, czy plik już istnieje w folderze
Spróbuj wpisać lub odczytać plik. To powinno zwrócić błąd. – RedX
@RedX to nie działa jak UNIX. – LtWorf
Tak, wiem, że muszę przeczytać lub otworzyć ten plik, ale czy istnieje sposób na otwarcie lub odczytanie pliku za pomocą tylko fd? czy istnieje funkcja io do odczytywania lub otwierania za pomocą tylko fd, bez ścieżki lub FILE * –