トップ回答者
フォルダのMoveFile で「ERROR_ACCESS_DENIED(アクセスが拒否)」エラーとなる

質問
-
Explorerで下位フォルダを開いていると上位フォルダの MoveFile で「ERROR_ACCESS_DENIED(アクセス拒否)」のエラーとなります。
具体的には、
testfolder
+- subfolder
のフォルダがあり、Explorer で subfolder を開いておきます。
この状態で、testfolderのMoveFileを実行すると、エラーとなります。(MoveFileExでもエラーとなりました)
Explorerで一つ上のtestfolderに移動した後(subfolderを開いていない状態)、MoveFileを実行すると、正常に testfolderがリネームされます。
MoveFileでなくSHFileOperationを使用すればエラーは発生しないという記事を見ましたが、ウィンドウを持たないプログラムなのでこの関数は使用できません。
どなたが解決策をご存じの方がいらっしゃいましたらご教授ください。
回答
すべての返信
-
ウィンドウハンドルをNULLにして失敗していたと思ったのですが、再度試してみたところ、SHFileOperationで問題なくリネームができました。大変ありがとうございました。以下が確認したソースです。
SHFILEOPSTRUCT fop = {0};
fop.hwnd = NULL;
fop.wFunc = FO_MOVE;
fop.fFlags = FOF_SILENT;
fop.pFrom = _T("C:\\Users\\user-name\\Documents\\testfolder");
fop.pTo = _T("C:\\Users\\user-name\\Documents\\testfolder_new)";
int ret = SHFileOperation(&fop);- 編集済み HiroXXX 2013年1月17日 12:21
-
ウィンドウハンドルをNULLにして失敗していたと思ったのですが、再度試してみたところ、SHFileOperationで問題なくリネームができました。大変ありがとうございました。以下が確認したソースです。
SHFILEOPSTRUCT fop = {0};
fop.hwnd = NULL;
fop.wFunc = FO_MOVE;
fop.fFlags = FOF_SILENT;
fop.pFrom = _T("C:\\Users\\user-name\\Documents\\testfolder");
fop.pTo = _T("C:\\Users\\user-name\\Documents\\testfolder_new)";
int ret = SHFileOperation(&fop);
pFrom と pTo は "This string must be double-null terminated." なので、'¥0' を 2 個続けてバッファの終わりを教えてあげないといけないはずです。
成功したり失敗したり動きが不安定なのは、そのせいではないかと。
(今回はたまたま成功してしまっただけで、同じコードでも失敗する可能性はあります。)
SHFILEOPSTRUCT structure (Windows)
http://msdn.microsoft.com/en-us/library/bb759795(VS.85).aspx