2011-01-09 29 views
5

Tôi đang viết chương trình Qt (4.7 cho Windows 7 ban đầu) yêu cầu phải ghi vào thư mục đã cài đặt (C: \ Program Files ...). Không có tệp nào được tạo khi tôi cố gắng ghi vào một vị trí sẽ được "bảo vệ" (tệp chương trình, C: \ etc). Tuy nhiên, QFile không cho tôi bất kỳ mã lỗi nào (error() trả về 0 có nghĩa là nó hoạt động tốt).Qt không thể tạo/ghi vào C:

Đây là đoạn mã mà tôi đang sử dụng không hoạt động. Tôi đóng tập tin của nó chỉ sau này trong chương trình.

QỨng dụng a (argc, argv);

// Setting plugin paths. 
QStringList paths = QCoreApplication::libraryPaths(); 
paths.append(QCoreApplication::applicationDirPath()); 
QCoreApplication::setLibraryPaths(paths); 



// Debug file. 
QString path = QCoreApplication::applicationDirPath() + "/debug.dat"; 
//QFile debugFile(QCoreApplication::applicationDirPath() + "/debug.dat"); 
QFile debugFile("C:/debug.txt"); 
qDebug() << debugFile.error(); 
debugFile.setPermissions(QFile::WriteUser | QFile::WriteGroup | QFile::WriteOwner | QFile::WriteOther); 
debugFile.open(QFile::WriteOnly); 
QTextStream debugStream(&debugFile); 

// Processing the arguments. 
debugStream << QString("Processing Arguments\n"); 

Có ai có mẹo nào về cách giải quyết vấn đề này không?

Thanks for the help,

JEC


Thêm một file manifest là con đường tôi chọn để khắc phục vấn đề này.

Cảm ơn tất cả sự giúp đỡ.

+2

"Tuy nhiên, QFile không cung cấp cho tôi bất kỳ mã lỗi nào": Bạn nên kiểm tra giá trị trả về của debugFile.open(). –

Trả lời

7

Bạn đã kiểm tra xem tệp không được tạo trong VirtualStore cho người dùng đó chưa? Kiểm tra Trình xem sự kiện trong Nhật ký ứng dụng và dịch vụ -> Microsoft -> Windows -> UacFileVirtualization -> Operational. Nếu bạn thấy các mục có ID sự kiện 5000, một sự kiện FileCreateVirtualExclude đã xảy ra.

Kiểm tra xem tệp không được tạo dưới %USERPROFILE%\AppData\Local\VirtualStore. Nếu nó đã làm, bạn có thể cần phải nhúng một biểu hiện yêu cầu đặc quyền cần thiết (ví dụ, biến ảo ra.)

Để biết thêm chi tiết, xem New UAC Technologies for Windows Vista (di chuyển xuống và tìm kiếm Virtualization.)

+0

Bạn đã hoàn toàn chính xác. Các tệp của tôi đã được lưu trữ trong cửa hàng ảo (tốt nhất là trong số chúng. Tôi có một thư mục con không được lưu trữ hầu như vì một số lý do). Tôi đã thêm tệp kê khai để chương trình của tôi hiện đang chạy hầu như. Cảm ơn. – jecjackal

2

Bạn cần có đủ quyền truy cập của người dùng (nghĩa là "Chạy với tư cách quản trị viên") để ghi vào các thư mục đó trong Windows Vista +. Khởi động ứng dụng với tư cách quản trị viên hoặc yêu cầu quyền Quản trị viên thông qua cuộc gọi đến WinAPI.

+0

AFAIK bạn không thể yêu cầu quyền quản trị cho một quá trình đang chạy nhưng phải bắt đầu một quy trình khác để thực hiện các thao tác yêu cầu các quyền đó. –

2

QFile chưa đưa ra bạn là một mã lỗi, nhưng bạn đã không kiểm tra được nó.

Bạn nên làm một cái gì đó giống như:

if (!debugFile.open(QFile::WriteOnly)) { 
    qWarning() << "Failed to open" << debugFile.fileName() << "for write:" << debugFile.errorString(); 
} 

Bạn đã kiểm tra giá trị trả về của QFile::error, nhưng chỉ trước gọi open - bạn cần phải kiểm tra sau nỗ lực mở.

+0

Wow, bạn đã đúng. Tôi đã kiểm tra mã lỗi trước khi mở tệp. Vâng thats những gì xảy ra khi tôi ở lại muộn mã hóa :). Cảm ơn. – jecjackal

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