2017-12-15 144 views
0

Windows 7でQt5.6.2を使用しています.My Goalは、CustomDatafileを選択したドライブ(主にペンドライブまたはローカルドライブまたはネットワークドライブ)に保存することです。Qtで選択したドライブの空き容量を確認する方法は?

ファイルを保存する前に、使用可能なメモリと選択したパスの書き込みアクセスを確認したいと思います。

このthreadからQStorageInfoクラスについて知りました。だから私は以下の関数を書いた。

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; 
    } 
} 

これは、デバッグ出力です:

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" 

あなたはQStorageInfoは、常に準備ができていないドライブ、私に0サイズを与えて見ることができるように。どんなドライブを選んでも結果は常に同じです。誰でもエラーを指摘できますか?私の問題の解決方法は?前もって感謝します。

編集1: IはQStorageのコンストラクタをハード場合

QStorageInfoストレージ( "D:")。 それから、すべてうまくいきます。 パスを指定した場合 QStorageInfoストレージ( "D:\ Application Cube DMU65mB.cba");

次に動作しません。ユーザーは、任意のドライブ(ローカルドライブまたはリムーバブルドライブ)を選択できます。フォルダを選択すると、QDialogからのパスが取得されます(コードはここには表示されません)。だから私は道からの情報を得ることができれば私の問題は解決されると思う。さて、どのようにしてドライブ名のみを取得できますか?私はQDialogから得たパスを解析することでできますが、それ以上の解決策はありますか?ありがとう

編集2: コンストラクタをに変更しました。QStorageInfoストレージ(パス)。。それはローカルドライブで動作しますが、ユーザーがリムーバブルドライブ(ペンドライブ)を選択しても動作しません。誰もがなぜペンドライブのために働いていないのか考えていますか?ありがとう。

+1

この関数を呼び出すと、ファイルは既に存在しますか? '' d:\\ "'をコンストラクタの引数としてハードコーディングするとどうなりますか? –

+0

[isValid()](http://doc.qt.io/qt-5/qstorageinfo.html#isV​​alid)を呼び出して、有効なパスを指定したかどうかを確認しましたか? – MrEricSir

+0

@MrEricSir [isValid()](http://doc.qt.io/qt-5/qstorageinfo.html#isV​​alid)は常にfalseです。私はドライブが存在し、私も書き込みアクセスを持っているにもかかわらず、なぜそれが偽であるのか理解できませんか? – vishnu

答えて

0

問題は、QStorageInfoクラスのコンストラクタに渡されるパスに問題があります。パスにファイル名が含まれている場合、となります。次のように動作します。

注:フルパスにはファイル名が含まれていますが、パスには含まれません。

次に、次の問題が発生します。QStorageInfo::isReadOnly()は書き込みアクセス権があってもfalseを返します。これは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()); 
    } 
関連する問題