0

次のコードを使用して、QFileInfo を使用して特定のディレクトリに書き込めるかどうかを判断しています。

QFileInfo dinfo(dirname);
if (dinfo.exists())
  valid = dinfo.isWritable()

残念ながら、Vista 64 で現在のユーザーのデスクトップのパスを渡すと、次のようになります。

C:\Users\USERNAME\Desktop

QFileInfo::isWritable() は false を返します。ただし、別のディレクトリ (C:\Temp など) を渡すと、true が返されます。5555 (誰にも書き込み不可) であった QFileInfo オブジェクトからディレクトリのアクセス許可を要求しました。このコードは、Windows XP を含む他のプラットフォームで期待どおりに機能します。ここで何が起こっているのか、誰にもアイデアがあります。

参考までに、チェックを外すと、実際にファイルをその場所に問題なく保存できます。

4

3 に答える 3

3

そこで、Qt の Task Tracker を少し調べてみたところ、QFileInfo::isWritable() はファイルに対してのみ有効であり、ディレクトリに対しては有効ではないことがわかりました。ディレクトリが書き込み可能かどうかを尋ねるのではなく、目的のファイルを作成できるかどうかを尋ねるようにコードを変更することで、目的の結果を得ることができました。

QDir dir(dirname);
if (dir.exists())
{
  QFileInfo finfo(dir.absoluteFilePath(fname));
  valid = finfo.isWritable();
} 

ありがとう。

于 2009-07-07T21:19:56.083 に答える
0

ディレクトリ「C:\ Users \ USERNAME \ Desktop」は、WindowsVistaではデフォルトで読み取り専用です。これは、フォルダにファイルを書き込めないという意味ではありません。これは、ディレクトリ自体を調整できないことを意味します(名前の変更など)。

于 2009-07-07T08:04:37.757 に答える
0

ここでは非常に大雑把な推測をしていますが、それがリンク、ショートカット、エイリアス、またはその他の疑似フォルダーであるかどうかを確認しましたか? 指しているアイテムのアクセス許可ではなく、書き込み可能ではないハードコードされたシンボリックリンクのアクセス許可を取得している可能性があるようです。

ドキュメントからisSymLink()(太字は私が追加):

Unix (Mac OS X を含む) では、シンボリック リンクを開くと、リンクのターゲットが効果的に開きます。Windows では、.lnk ファイル自体を開きます。

したがって、 の結果を確認し、isSymLink()必要に応じて実際のターゲットを取得しますsymLinkTarget()(最後のドキュメントを参照してください。ターゲットが実際に存在する場合と存在しない場合があります)。

于 2009-07-07T01:36:46.343 に答える