Jak mogę odmówić dostępu do pliku, który otwieram za pomocą fstream? Chcę uniemożliwić dostęp do pliku podczas odczytu/zapisu do niego za pomocą programu fstream?Używanie std: fstream jak odmawiać dostępu (czytać i pisać) do pliku
Odpowiedz
Nie możesz tego zrobić za pomocą standardowego strumienia, musisz użyć funkcji specyficznych dla platformy.
W systemie Windows można użyć CreateFile() lub LockFileEx(). W systemie Linux jest flock(), lockf() i fcntl() (jak powiedział poprzedni komentator).
Jeśli używasz MSVC, możesz przekazać trzeci parametr do konstruktora fstream. Zobacz dokumentację dla Visual Studio 6 lub newer versions. Oczywiście nie będzie działać z innymi kompilatorami i platformami.
Dlaczego i tak chcesz zablokować inne? Może być lepsze rozwiązanie ...
[Ten wątek] (http: // stackoverflow.com/questions/4435091/sh-none-is-not-a-member-of-stdbasic-filebuf-elem-traits/4435481 # 4435481) dostarcza więcej informacji o używaniu 'fstream' – Casebash
Nie można tego zrobić w natywnym języku C++, ponieważ byłoby to zależne od platformy. W systemie Linux/UNIX można to zrobić za pomocą flock
lub fcntl
. Naprawdę nie wiem, jak to zrobić w systemie Windows.
W przypadku okien wygląda na to, że trzeba przekazać niektóre flagi do CreatFile
lub użyć LockFileEx
(która umożliwia blokowanie zakresu bajtów).
Należy pamiętać, że wszystkie te metody działają na bazowych deskryptorach plików/uchwytach systemu operacyjnego, a nie na fstream
s. Będziesz musiał użyć Posix lub Windows API do odczytu/zapisu z pliku lub owinąć deskryptor/uchwyt pliku w postaci fstream
. To znowu zależy od platformy. Jestem pewien, że jest sposób, żeby to zrobić, ale nie pamiętam tego z mojej głowy.
Przy użyciu modułu Boos Interprocess dostępna jest funkcja file lock.
Zablokuj plik, otwórz go, przeczytaj i/lub zapisz z/do niego, zamknij, odblokuj.
Rozszerzenie na komentarzem Casebash:
otworzyć plik w oknach tak, że inne procesy nie mogą napisać go używać
file.rdbuf()->open(path, std::ios_base::app, _SH_DENYWR);
_SH_DENYRW przeczę zarówno odczytu i zapisu
- 1. Jak czytać i pisać do pliku tekstowego w C++?
- 2. Odzyskiwanie deskryptor pliku z std :: fstream
- 3. std :: fstream nie tworzy plik
- 4. W Clojure 1.3, Jak czytać i pisać plik
- 5. fstream nie utworzy pliku
- 6. Jak czytać i pisać znaczniki id3v1 i id3v2 w Elixir
- 7. Jak pisać/czytać na karcie inteligentnej?
- 8. Odczytywanie i zapisywanie do tego samego pliku przy użyciu tego samego pliku fstream
- 9. Jak pisać na środku pliku w C++?
- 10. Jak szybko czytać i pisać w trybie listview w delphi?
- 11. Jak czytać z TCP i pisać na standardowe wyjście?
- 12. pliki std :: fstream więcej niż 2 gb
- 13. Jak korzystać z domyślnych ograniczników podczas czytania pliku tekstowego ze std :: fstream?
- 14. Jak zwrócić fstream (C++ 0x)
- 15. Jak dołączyć do pliku z flagą fstream fstream :: app wydaje się nie działać
- 16. fstream seekg(), seekp() i write()
- 17. Java FileWriter, jak pisać do następnej linii
- 18. Jak pisać do pliku w .NET Core?
- 19. C++ Boost ASIO: jak czytać/pisać z limitem czasu?
- 20. Jak pisać do pliku w Ruby?
- 21. Jak pisać/czytać pandy Series to/from csv?
- 22. Odmowa dostępu do pliku file_put_contents
- 23. Jak otworzyć std :: fstream (ofstream lub ifstream) z nazwą pliku Unicode?
- 24. Używanie funkcji freopen() do drukowania do pliku i ekranu
- 25. czy wskaźnik ruchu pliku odczytu/zapisu fstream
- 26. Jak pułapkować próby dostępu do plików za pomocą sterownika filtru (jądra) i okna dialogowego oferty zezwalać/odmawiać (użytkownikowi)?
- 27. Używanie self-> ivar do bezpośredniego dostępu do zmiennych instancji
- 28. Jak czytać wiersz z pliku w PowerShell
- 29. C# Jak czytać i pisać z wieloliniowej linii tekstu po linii?
- 30. jak czytać bajt po bajcie z pliku
Muszę odczytać z pliku i zmienić wiersze zgodnie z zawartością. Chcę uniknąć zmian w pliku podczas czytania i pisania do niego (mam najnowsze dane i nie przesłonię) Wprowadziłem to za pomocą fstream, czy muszę zmienić cały kod na używanie uchwytów i buforów (readfile) czy mogę zdobyć uchwyt od strumienia? Miałem problemy z plikiem readfile i writefile, ponieważ muszę czytać wiersz po linii i napisać tak. (Z fstream użyłem funkcji getline fstream fs (path) while (file.eof()) \t getline (fs, linia);.! coś zrobić ... fs.write (str, str.size ()); fs.clear(); fs.close(); – sofr
Chcesz zabezpieczyć swój plik przed inną instancją programu lub z innego programu? Po pierwsze, prostym rozwiązaniem jest użycie plików blokujących/katalogi - większość programów robi to w ten sposób, po drugie, nigdy tego nie widziałem - jeśli naprawdę tego potrzebujesz, zobacz moją odpowiedź: – Hali