IOエラー145とは?

解決


komin  2008-10-23 03:12:33  No: 32304

常駐してメールサーバをチェックしに行くアプリケーションを作っています。最近になって「IOエラー145」が出るようになりました。いろいろ調べて見たのですが、このエラーコードに関する説明が見つかりません。ご存じの方は教えてください。
環境は下記の通り
WindowsXP SP3
Delphi6 Oroffesional
  以上、よろしくお願い致します。


igy  2008-10-23 05:11:48  No: 32305

Googleで検索すると、

Delphi I/O Errors:
http://erikmartin.com/pro/ioerrors.html

があるみたいですが。


komin  2008-10-24 07:49:46  No: 32306

igyさん、ありがとうございました。
おかげさまで問題解決の糸口が見つかりました。
やろうとしていることは、ディレクトリの削除で、これを実行する前に外灯ディレクトリ内のファイルはすべて削除するようにコードを書いていたのですが、タイミング的にまだファイルが残っていると判断されることがあるようです。
具体的な解決策が解りましたら報告します。


それって  2008-10-24 11:17:46  No: 32307

sleep(100)ぐらいで回して、タイムアウトを設定すれば良いんじゃ?


komin  2008-10-25 05:44:05  No: 32308

Sleepかけるくらいはすでに試行済み。
それでもだめだから聞いてみたわけです。


あのさ?  2008-10-25 09:02:34  No: 32309

質問する上で情報の後出しはマナー違反だっての知ってる?
「そのぐらいやってるよ」みたいな反応は何?
回答くれる人をなんだと思ってんの?


通りすがり  2008-10-26 08:00:17  No: 32310

あのさ?さん
そんなにとんがらないでもいいんじゃない?  Sleepかます位は初心者でも考えることだし…


TS  2008-10-26 17:59:31  No: 32311

>これを実行する前に該当ディレクトリ内のファイルはすべて削除するよう
>に>コードを書いていたのですが、タイミング的にまだファイルが残って
そのディレクトリ内にファイルがあるかどうか調べて次に進んでは。


・・・  2008-10-26 19:00:00  No: 32312

> Sleepかます位は初心者でも考えることだし…
初心者がそこまで考えるとは思えんのだが?
それに、最初は「IOエラー145」、次は「ディレクトリ削除の〜」
さらに「Sleepは使っている」
ソース晒せなくても、どんなコード書いているかくらいの説明は出来るはずなのに、
次々と、情報の後出しをしている点。
あのさ?さんじゃないが、回答する気失せるよ。
まだ、なんか隠していることが出てきて、回答が無駄になると思っている人いるはず。

> ディレクトリの削除で、これを実行する前に外灯ディレクトリ内の
> ファイルはすべて削除するようにコードを書いていたのですが、
> タイミング的にまだファイルが残っていると判断されることがあるようです。

タイミングだけに限らず、ファイルがロックされている場合もある。
ファイルの削除をどのようにしているのかわからないが、例えば
APIを使っているのであれば、GetLastErrorでエラーを確認するとか、
フォルダが削除できるまで、数回トライしてみるとか。
まぁ、どこのディレクトリ削除しているのかもわかんないけどね。


nobukoshi802  2008-10-28 21:53:45  No: 32313

サーバのハードディスクはRAID構成でバッファを積んでいる場合
バッファ遅延を起こして、処理で削除しているのに
fileexistsではファイルが存在している現象が発生したことがあります
fileexistsを使用しないでWin32APIを直接たたいて回避しました
参考になれば


komin  2008-10-31 06:01:39  No: 32314

nobukoshi802さん
  どうやらそれが原因として突き止めました。最初はFindFirst〜FindNextでファイルが存在しないことを確認してからrmDIrしていたのですが、これだと前記のような現象が発生します。そこで、SHellAPIのSHFileOperationを使ってみたところ、期待したとおりの動作を得ることができました。

var
  foStruct:  TSHFileOpStruct;
  res : integer;
begin
  with   foStruct   do  begin
    wnd                :=   Handle;
    wFunc              :=   FO_DELETE;
    pFrom              :=   PChar('フォルダ名' + #0);
    pTo                :=   nil);
    fFlags             :=   fof_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
    fAnyOperationsAborted   := False;
    hNameMappings      :=   nil;
    lpszProgressTitle  :=   nil;
  end;
  Res := SHFileOperation(foStruct);

  これでいけました。ありがとうございました。


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

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






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