久しぶりに投稿します。
以下のようなサブルーチンを作って
フォルダの中のファイルと、そのフォルダを削除したいのですが、
肝心のフォルダの削除がうまくいきません。
アプリ内で一時的に作ったフォルダを削除したいだけなので、
フォルダ内にはファイルしかありません。
RmDirをするとI/Oエラー32が出ます(共有違反)。
RemoveDirをするとエラーは出ませんが削除もできません。
デバッガで追跡したところ・・
1、RmDirやRemoveDirの前段階でフォルダは空です。
2、カレントDirも別Dirに移動しています。
3、FindCloseでSearchRecを解放してます。
・・が、結局フォルダが残ったままです。
アプリを動かしたままエクスプローラ上で削除しようとすると共有違反が出ますので、何かしら握っているものと思いますが、解放の方法が分かりません・・
ご教授願いますでしょうか?
procedure DeleteDir(Directory: String);
var
SearchRec: TSearchRec;
OldDirectory: String;
begin
OldDirectory := GetCurrentDir;
SetCurrentDir(Directory);
// ファイルの検索を開始する
if FindFirst('*.*', faAnyFile, SearchRec) = 0 then
begin
try
repeat
if(SearchRec.Name <> '.')and(SearchRec.Name <> '..')then
begin
// ディレクトリの中身を全部削除する
DeleteFile( Directory + SearchRec.Name );
end;
// 次のファイルを探してリピートする
until FindNext(SearchRec) <> 0;
finally
// SearchRecを解放
FindClose(SearchRec);
end;
end;
// カレントDirを変更
SetCurrentDir(OldDirectory);
// ディレクトリの削除
if DirectoryExists(Directory) then
begin
try
// ↓↓全部試しましたがDirの削除が出来ません↓↓
RmDir( PChar(Directory) );
// RmDir( Directory );
// RemoveDir( Directory );
except
end;
end;
end;
自己解決しました。申し訳ないです・・
情けない話ですが、別のルーチンでFindCloseをし忘れてたため、そのSearchRecがディレクトリを握ってたようです(泣)。
ルーチン自体は↑で全く問題なく動作しましたので、
似たようなことしたい方は参考にしてください。と言い訳しときます(汗)
板汚しスミマセンです・・。
ツイート | ![]() |