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
Trả lời
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() và 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 ...
[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
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.
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.
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
- 1. Đọc và ghi vào cùng một tệp bằng cách sử dụng cùng một fstream
- 2. Truy cập tệp bị từ chối
- 3. "Lỗi: cs0016 không thể ghi vào tệp xuất ... truy cập bị từ chối"
- 4. System.IO.WriteAllBytes - Truy cập vào đường dẫn bị từ chối lỗi
- 5. Không thể ghi vào tập tin đầu ra - Truy cập bị từ chối
- 6. ASP.NET + Quyền truy cập vào đường dẫn bị từ chối
- 7. "Truy cập vào đường dẫn ... bị từ chối" (.NET C#)
- 8. Quyền truy cập bị từ chối khi sử dụng FileOutputStream
- 9. Truy cập bị từ chối khi sử dụng RunWithElevatedPrivileges?
- 10. tại sao truy cập vào cổng com bị từ chối?
- 11. Truy cập vào đường dẫn **** bị từ chối
- 12. cách từ chối người dùng truy cập các thư mục con và tệp?
- 13. Đầu ra truy vấn vào tệp cho phép lỗi truy cập bị từ chối
- 14. Cách đọc tệp và ghi vào tệp văn bản?
- 15. Truy cập bị từ chối vào thư mục Temp ASP.NET
- 16. Từ chối truy cập trực tiếp vào các trang jsp
- 17. Truy cập Lỗi bị từ chối truy cập vào nhà cung cấp IIS WMI từ ASP
- 18. Từ chối truy cập nhiều tệp .php bằng .htaccess?
- 19. Truy cập vào các khóa registry bị từ chối (ABCPdf)
- 20. IIS7 403 - Truy cập bị từ chối
- 21. "Truy cập vào đường dẫn hệ thống bị từ chối" khi sử dụng 'System.IO.Directory.Delete'
- 22. Đọc/ghi vào tập tin bằng cách sử dụng jQuery
- 23. Truy cập từ chối đọc bộ đếm Perfmon từ máy từ xa (Asp.Net)
- 24. Đọc/Ghi vào ống linux bằng cách sử dụng Java
- 25. Đọc và ghi vào tệp Java qua Tài nguyên
- 26. Đọc từ tập tin, xóa nó, ghi vào nó
- 27. System.ComponentModel.Win32Exception: Truy cập bị từ chối Lỗi
- 28. Quyền nào được ghi với fstream?
- 29. Process.MainModule -> "Truy cập bị từ chối"
- 30. Cách đọc và ghi vào một tệp văn bản trong C++?
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
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