2009-05-08 67 views
9

Làm cách nào để từ chối quyền truy cập vào tệp tôi mở bằng fstream? Tôi muốn không thể truy cập vào tập tin trong khi tôi đang đọc/ghi nó với fstream?Sử dụng std: fstream cách từ chối truy cập (đọc và ghi) vào tệp

+0

Tôi cần phải đọc từ tập tin và thay đổi dòng theo nội dung. Tôi muốn tránh những thay đổi trong tập tin trong khi tôi đang đọc và ghi vào nó (có dữ liệu mới nhất và không ghi đè) Tôi ngụ ý nó bằng cách sử dụng fstream, tôi có cần phải thay đổi toàn bộ mã để sử dụng tay cầm và bộ đệm (readfile) hoặc tôi có thể nhận được một xử lý từ fstream? Tôi đã gặp rắc rối với readfile và writefile vì tôi cần phải đọc từng dòng và viết như vậy. (với fstream tôi sử dụng chức năng getline fstream fs (đường dẫn) trong khi (! file.eof()) \t getline (fs, line); làm điều gì đó ... fs.write (str, str.size ()); fs.clear(); fs.close(); – sofr

+0

Bạn có muốn bảo vệ tệp của mình khỏi một phiên bản chương trình khác hoặc từ một chương trình khác không?/thư mục - hầu hết các chương trình làm theo cách này.Đối với thứ hai, tôi đã không bao giờ nhìn thấy nó xảy ra - nếu bạn thực sự cần nó, xem câu trả lời của tôi – Hali

Trả lời

13

Bạn không thể làm điều đó với tiêu chuẩn fstream, bạn sẽ phải sử dụng các chức năng nền tảng cụ thể.

Trên Windows, bạn có thể sử dụng CreateFile() hoặc LockFileEx(). Trên Linux, có flock(), lockf()fcntl() (như người nhận xét trước đã nói).

Nếu bạn đang sử dụng MSVC, bạn có thể chuyển thông số thứ ba cho hàm tạo của fstream. Xem tài liệu cho Visual Studio 6 hoặc newer versions. Tất nhiên nó sẽ không hoạt động với các trình biên dịch và nền tảng khác.

Tại sao bạn muốn khóa người khác? Có thể có giải pháp tốt hơn ...

+1

[Chủ đề này] (http: // stackoverflow.com/questions/4435091/sh-none-is-not-a-thành viên-of-stdbasic-filebuf-elem-trait/4435481 # 4435481) cung cấp thêm thông tin về cách sử dụng 'fstream' – Casebash

3

Không có cách nào để làm điều này trong C++ gốc, vì nó sẽ phụ thuộc vào nền tảng cao. Trên Linux/UNIX, bạn có thể làm điều này với flock hoặc fcntl. Tôi không thực sự chắc chắn làm thế nào để làm điều đó trên Windows.

Trên cửa sổ, có vẻ như bạn phải chuyển một số cờ tới CreatFile hoặc sử dụng LockFileEx (cho phép khóa phạm vi byte).

Lưu ý rằng, tất cả các phương pháp này đều hoạt động trên các mô tả/trình xử lý tệp hệ điều hành cơ bản, không phải với fstream s. Bạn sẽ cần phải sử dụng Posix hoặc Windows API để đọc/ghi từ tệp, hoặc quấn bộ mô tả/xử lý tệp trong một fstream. Đây là nền tảng phụ thuộc một lần nữa. Tôi chắc chắn có một cách để làm điều đó, nhưng tôi không nhớ nó ra khỏi đỉnh đầu của tôi.

2

Sử dụng mô-đun Boos Interprocess, có chức năng file lock.

Khóa tệp, mở tệp, đọc và/hoặc ghi từ/vào tệp, đóng và mở khóa.

4

Mở rộng trên bình luận bằng Casebash:

Để mở một tập tin trong cửa sổ sao cho quá trình khác không thể viết thư cho nó sử dụng

file.rdbuf()->open(path, std::ios_base::app, _SH_DENYWR); 

_SH_DENYRW sẽ từ chối cả đọc và viết truy cập

Các vấn đề liên quan