2009-05-08 8 views
9

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

+0

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

+0

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

Odpowiedz

13

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 ...

+1

[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

3

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.

2

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.

4

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

Powiązane problemy