Windows에서 Qt5.6.2를 사용하고 있습니다. 내 목표는 CustomDatafile을 선택한 드라이브 (주로 펜 드라이브 또는 로컬 드라이브 또는 네트워크 드라이브)에 저장하는 것입니다.Qt에서 선택한 드라이브의 사용 가능한 여유 공간을 확인하는 방법은 무엇입니까?
파일을 저장하기 전에 사용 가능한 메모리를 확인하고 선택한 경로에 대한 쓰기 권한을 부여하고자합니다.
이 thread에서 QStorageInfo 클래스에 대해 알게되었습니다. 그래서 나는 아래의 함수를 썼다. 당신이 QStorageInfo은 항상 나에게 공 크기를주고 볼 수 있듯이,하지가 준비 드라이브
path to QStorage: "D:/Aluminium Demo DMU105mB.cba"
export root path: ""
volume name: ""
fileSystemType: ""
size: 0 MB
availableSize: 0 MB
"Selected drive validity: 0or storage availability: 0"
:
bool ImportExport::checkWriteAccessAndEnoughDriveSpace(const QString &path,QString &error)
{
error = QString();
int fileSizeMB = 100;//for testing purpose I am comparing with 100 MB. correct solution is to compare with size of the file.
qDebug() << "path to QStorage: " <<path;
QStorageInfo storage(path);
//QStorageInfo storage = QStorageInfo::root();
qDebug() << "export root path: " <<storage.rootPath();
qDebug() << "volume name:" << storage.name();
qDebug() << "fileSystemType:" << storage.fileSystemType();
qDebug() << "size:" << storage.bytesTotal()/1000/1000 << "MB";
qDebug() << "availableSize:" << storage.bytesAvailable()/1000/1000 << "MB";
if (storage.isValid() && storage.isReady()) {
if (!storage.isReadOnly()) {
// check enough memory
int MBavailable = storage.bytesAvailable()/1000/1000;
if(MBavailable > fileSizeMB){
return true;
}else{
error = tr("Not enough disk space, available disk space is only : ") + QString::number(MBavailable);
return false;
}
}else{
error = tr("No permission to write to current folder ");
qDebug() << error; // how to set this message as toolTip on the fileDialog
return false;
}
}else{
error = tr("Selected drive validity: ")+ QString::number(storage.isValid()) +tr("or storage availability: ") +QString::number(storage.isReady());
qDebug() << error; // how to set this message as toolTip
return false;
}
}
이
디버그 출력됩니다. 드라이브가 내가 선택한 결과가 언제나 동일합니다. 아무도 오류를 지적 할 수 있습니까? 내 문제에 대한 모든 솔루션? 미리 감사드립니다.편집 1 제가
QStorage의 생성자QStorageInfo 저장 하드 코딩하는 경우 ("D를"); 그러면 모든 것이 잘 작동합니다. 경로를 지정하면 QStorageInfo 저장소 ("D : \ Application Cube DMU65mB.cba");
그런 다음 작동하지 않습니다. 사용자는 모든 드라이브 (로컬 드라이브 또는 이동식 드라이브)를 선택할 수 있습니다. 폴더를 선택할 때 QDialog에서 경로를 얻습니다 (코드는 여기에 표시되지 않음). 그래서 나는 길에서 Drive Infromation만을 얻을 수 있다면 내 문제가 해결 될 것이라고 생각합니다. 이제 드라이브 이름 만 어떻게 얻을 수 있습니까? QDialog에서 얻은 경로를 파싱하면 더 좋은 해결책이 될 수 있습니까? 감사합니다
편집 2 : 변경자를 으로 변경했습니다. QStorageInfo 저장소 (경로);. 그런 다음 로컬 드라이브에서 작동하지만 사용자가 이동식 드라이브 (펜 드라이브)를 선택하면 작동하지 않습니다. 누구나 펜 드라이브에서 왜 작동하지 않는지 알 수 있습니까? 감사.
이 기능을 호출 할 때 파일이 이미 존재합니까? ''d : \\ "'를 생성자의 인수로 하드 코딩하면 어떻게 될까요? –
유효한 경로를 입력했는지 확인하려면 [isValid()] (http://doc.qt.io/qt-5/qstorageinfo.html#isValid)를 호출 해 보았습니까? – MrEricSir
@MrEricSir [isValid()] (http://doc.qt.io/qt-5/qstorageinfo.html#isValid)는 항상 false입니다. 나는 드라이브가 존재하고 쓰기 권한이 있다고하더라도 왜 그것이 거짓인지 이해할 수 없다. – vishnu