RmDirが出来ません・・

解決


吉岡  2003-11-03 15:37:45  No: 5566

久しぶりに投稿します。
以下のようなサブルーチンを作って
フォルダの中のファイルと、そのフォルダを削除したいのですが、
肝心のフォルダの削除がうまくいきません。
アプリ内で一時的に作ったフォルダを削除したいだけなので、
フォルダ内にはファイルしかありません。

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;


吉岡  2003-11-03 16:05:09  No: 5567

自己解決しました。申し訳ないです・・

情けない話ですが、別のルーチンでFindCloseをし忘れてたため、そのSearchRecがディレクトリを握ってたようです(泣)。

ルーチン自体は↑で全く問題なく動作しましたので、
似たようなことしたい方は参考にしてください。と言い訳しときます(汗)

板汚しスミマセンです・・。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加