2017-12-15 21 views
0

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 저장소 (경로);. 그런 다음 로컬 드라이브에서 작동하지만 사용자가 이동식 드라이브 (펜 드라이브)를 선택하면 작동하지 않습니다. 누구나 펜 드라이브에서 왜 작동하지 않는지 알 수 있습니까? 감사.

+1

이 기능을 호출 할 때 파일이 이미 존재합니까? ''d : \\ "'를 생성자의 인수로 하드 코딩하면 어떻게 될까요? –

+0

유효한 경로를 입력했는지 확인하려면 [isValid()] (http://doc.qt.io/qt-5/qstorageinfo.html#isValid)를 호출 해 보았습니까? – MrEricSir

+0

@MrEricSir [isValid()] (http://doc.qt.io/qt-5/qstorageinfo.html#isValid)는 항상 false입니다. 나는 드라이브가 존재하고 쓰기 권한이 있다고하더라도 왜 그것이 거짓인지 이해할 수 없다. – vishnu

답변

0

문제는 QStorageInfo 클래스의 생성자에 주어진 경로에 있습니다. 경로에 파일 이름이 포함되어 있으면 이 아닌이 작동합니다. 다음은 작동합니다 :

참고 : 경로는 그렇지 않지만 전체 경로는 파일 이름을 포함합니다.

다음 문제가 발생합니다. QStorageInfo::isReadOnly()은 쓰기 권한이 있어도 거짓임을 나타냅니다. 이것은 Windows-NFTS 파일 시스템으로 인해 작동하지 않습니다. 그래서 임시 파일을 sucecssfully 만들 수 있는지 확인하는 것이 트릭입니다.

if (storage.isValid() && storage.isReady()) { 
     //check write permission 
     QString filename(path+"dummyTempJob.job"); //temp file, a workaround to check write access because QFileInfo isWritable and storage.isReadOnly() doesn't work for windows NTFS system 
     QFile file(filename); 
     if(file.open(QIODevice::WriteOnly)){ 
      file.remove();//delete the temp file 
      checkWriteAccess = true; 
     }else{ 
     error = QObject::tr("No write permissions to %1.").arg(path); 
     qCritical()<< error; 
     } 
    }else{ 
     error = QObject::tr("Drive %1 is not available.").arg(storage.rootPath()); 
     qCritical() << error << QStringLiteral(" valid = %1, ready = %2").arg(storage.isValid()).arg(storage.isReady()); 
    }