2016-07-02 13 views
5

Một trong các phương pháp QIODevice được thực hiện lại open() trong QFile có đối số QFileDevice::FileHandleFlag. Nhìn vào tài liệu cho nó có hai lựa chọn với các mô tả mâu thuẫn.Qt có tự động đóng các tệp không?

Từ QFileDevicedocumentation:

  • QFileDevice::AutoCloseHandle - Các tập tin xử lý thông qua vào open() nên được đóng lại bởi close(), hành vi mặc định được rằng gần chỉ xả các tập tin và các ứng dụng chịu trách nhiệm đóng trình xử lý tệp. Khi mở một tệp theo tên, cờ này bị bỏ qua vì Qt luôn sở hữu bộ xử lý tệp và phải đóng nó.

  • QFileDevice::DontCloseHandle - Nếu không đóng một cách rõ ràng, xử lý tệp cơ bản sẽ được mở khi đối tượng QFile bị hủy.

Vì vậy, hiện Qt tự động đóng tập tin hay không và không thiết lập tùy chọn này thực sự thay đổi bất cứ điều gì?

+3

DontCloseHandle là khi ứng dụng cung cấp * xử lý * đã mở trước đó và quay lưng con Qt trên đó. Trong trường hợp này, ứng dụng (không phải Qt) có thể muốn giữ lại quyền sở hữu suốt đời. So sánh điều này với "* Khi mở tệp theo tên *, cờ này bị bỏ qua vì * Qt luôn sở hữu xử lý tệp * và phải đóng nó." – user2864740

Trả lời

5

Sau khi tra cứu nguồn Qt, tôi đã tìm thấy dòng trong QFSFileEngine.cpp:378* mà cuối cùng sử dụng cờ.

QFile::open() có thể được chuyển qua bộ xử lý hiện có (stdio.h) FILE không được tạo bởi Qt và không được tự động đóng bởi Qt. Trong các tập tin tương phản được mở bởi Qt sẽ tự động đóng bởi Qt.

Cờ QFileDevice::FileHandleFlag là dành cho trường hợp cũ và cho phép lập trình viên chỉ định nếu QFile nên tự động đóng tệp bỏ qua thực tế là nó không được mở bởi Qt.


* Tìm kiếm closeFileHandle nếu số dòng không phù hợp.

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