DOBON.NETプログラミング道掲示板
(現在 過去ログ3 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■34273 / inTopicNo.1)  FILE.COPYでIOExceptionエラーが出る
  
□投稿者/ オフィス・ケイ 一般人(1回)-(2019/07/03(Wed) 09:25:29)
  • アイコン環境/言語:[WindowsCE6.0 VB.NET2008 .NET Compact FrameWork3.5 ] 
    分類:[.NET] 

    初めまして。
    初めて投稿します。

    現在、Vb.net2008でPDAの開発を行っています。
    PDAのOSはWindows CE6.0になります。
    フレームワークは.net CompactFrameWork3.5です。

    処理内容として、PDAで作成されたテキストファイルをネットワーク越しの共有フォルダにコピーしています。

    File.COYを使用しているのですが、稀にシステムエラー(IOException)で処理が落ちるのです。
    原因として何が考えられるのでしょうか?
    ネットワークは無線LANで接続しています。

    ----- 参考ソース ------

    sFileRireki:送信元ファイル
    sFileTRireki:送信先ファイル
    psInit.sUpLoadD:送信先フォルダ

    Try

    If File.Exists(sFileRireki) = True Then 'あり
    If Directory.Exists(psInit.sUpLoadD + "\") = False Then
    sErrMsg = "アップロード先フォルダが無いか、ネットワーク接続できませんでした。(COPY直前チェック)" + vbCrLf + psInit.sUpLoadD
    Return False
    End If
    IO.File.Copy(sFileRireki, sFileTRireki,True)
    '送信後、削除
    If File.Exists(sFileRireki) = True Then
    File.Delete(sFileRireki)
    Else
    Return False
    End If
    Else
    Return False
    End If
    Catch ex As Exception
    sErrMsg = "アップロード(履歴データ送信)に失敗しました。" + vbCrLf + vbCrLf + ex.Message
    Return False
    Finally
    Call sub_WriteLog(sErrMsg, "", pciLogModeE, "fnc_LogDataSend")
    End Try

    ------- エラー内容 ----------

    アップロード(履歴データ送信)に失敗しました。IOException

    以上になります。
    よろしくお願いします。

引用返信 削除キー/
■34274 / inTopicNo.2)  Re[1]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ 魔界の仮面弁士 大御所(1231回)-(2019/07/03(Wed) 12:38:05)
  • アイコンNo34273に返信(オフィス・ケイさんの記事)
    > File.COYを使用しているのですが、稀にシステムエラー(IOException)で処理が落ちるのです。
    稀に、ということは、時間をおいてリトライすると再現しなくなるということでしょうか。


    > 原因として何が考えられるのでしょうか?
    > ネットワークは無線LANで接続しています。
    共有フォルダー側でウイルススキャンが走って阻害されたとか?

    受信側(共有フォルダー側)で監査ログを有効にして、
    ファイル送出側での通信ログと照らし合わせてみるのは如何でしょうか。

    通信障害(何かしらのタイムアウトとか)だと、ログ判定では難しいですが…。
    ※Wi-Fi のスリープ復帰が間に合ってなかったとか、輻輳・瞬断とか



    > ----- 参考ソース ------

    File.Copy がエラー箇所なのだとしたら、.NET Compact Framework 3.5 の実装は
    こんな感じになっていました。

    IOException が生成されるパターンは、4 / 9 / 10 / 13 の場所ですね。

    10 は、メッセージリソースが存在している場合には
    IO_SharingViolation_File のメッセージリソースが表示されます。
    ウイルススキャンが原因だと、ありえそうな話かもしれません。

    それ以外の 4 / 9 / 13 の場所の IOException では、
    Message 引数の指定が無かったので、既定のメッセージがそのまま出力されるはず。



    ==========
    If いずれかのパスが Nothing Then
     ★1★ [&H80004003] ArgumentNullException
    ElseIf いずれかのパスが空文字列 Then
     ★2★ [&H80070057] ArgumentException
    End If
    sourceFullPath = sourceFileNameをフルパス変換
    destFullPath = destFileNameをフルパス変換
    Dim errorCode As Integer = CopyFile(sourceFileName, destFileName, Not overwrite) '※API呼び出し
    If errorCode <> 0 Then
     If sourceFullPath なファイルが存在しない Then
      ★3★ [&H80001000] FileNotFoundException 'sourceFileName
     ElseIf destFullPath なファイルが存在している Then
       'overwrite := False の状態で呼ばれた時限定
      ★4★ [&H80131620] IOException
     Else 'ここからは destFileName 系のエラー
      If errorCode <= &H80001001 Then
       Select Case errorCode
       Case ERROR_ACCESS_DENIED '&H80000004
        ★5★ [&H80070005] UnauthorizedAccessException
       Case &H80000008
        ★6★ [&H80131515] NotSupportedException
       Case ERROR_FILE_NOT_FOUND '&H80001000
        ★7★ [&H80070002] FileNotFoundException 'FileNotFound_FileName := destFileName
       Case &H80001001
        ★8★ [&H80070003] DirectoryNotFoundException 'PathNotFound_Path := destFileName
       End Select
      Else
       Select Case errorCode
       Case &H80001006
        ★9★ [&H80131620] IOException
       Case &H80001007
        Exit Select
       Case &H80001008
        ★10★ [&H80131620] IOException 'IO_SharingViolation_File := destFileName
       Case &H80003000
        ★11★ [&H80070057] ArgumentException
       Case 206
        ★12★ [&H800700CE] PathTooLongException
       End Select
      End If
      ★13★ [&H80131620] IOException
     End If
    End If
    Return '☆ここまでこれたら正常終了☆
引用返信 削除キー/
■34275 / inTopicNo.3)  Re[2]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ オフィス・ケエイ 一般人(1回)-(2019/07/03(Wed) 14:17:15)
  • アイコン魔界の仮面弁士 大御所様
    回答ありがとうございます。

    No34274に返信(魔界の仮面弁士さんの記事)
    >稀に、ということは、時間をおいてリトライすると再現しなくなるということでしょうか。
    =>正常終了する時もあれば、IOExceptionで落ちる時もある。
    ということです。
    また、その後はリトライしても同様にIOExceptionで落ちます。
      プログラムを一旦終了し、再度起動させるとうまくいきます。

    > 通信障害(何かしらのタイムアウトとか)だと、ログ判定では難しいですが…。
    > ※Wi-Fi のスリープ復帰が間に合ってなかったとか、輻輳・瞬断とか
     =>作成したプログラム内で、処理ログを出力しているのですが、
      そのログを見ると、一旦正常終了し、メニューを表示した状態で、
      しばらく時間を空け(2〜3時間)再度処理をすると落ちる感じです。
      一応File.Copyを実行する前にWifi接続を行ってから実行するようにしています。

     また、file.copyを実行する前に、Directory.Existsでcopy先のフォルダの存在チェックを行っています。
    存在する時に、file.copyを実行し、エラーをキャッチ(Try〜Chtch)しています。

    やはり、wifiの接続あたりが怪しいでしょうか?

    よろしくお願いします。
引用返信 削除キー/
■34276 / inTopicNo.4)  Re[3]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ 魔界の仮面弁士 大御所(1232回)-(2019/07/03(Wed) 17:05:49)
  • アイコンNo34275に返信(オフィス・ケエイさんの記事)
    > =>正常終了する時もあれば、IOExceptionで落ちる時もある。

    例外の発生地点は、File.Copy メソッドで間違いありませんか?
    比較的広い範囲にわたって Try ブロックが置かれているようなので。

    また、エラー発生時点の StackTrace を記録することは出来ますか?
    (Exception の ToString でも OK です)


    日本語ランゲージパック(Microsoft .NET CF 3.5 JA-String Resource)も
    検証環境にインストールしておいた方が調べやすいかもしれません。
    (無くても動きますが、例外メッセージの中身が変わってくる可能性がある)


    > また、その後はリトライしても同様にIOExceptionで落ちます。
    > プログラムを一旦終了し、再度起動させるとうまくいきます。

    正常時と失敗時で Directory.GetCurrentDirectory の値は同じでしょうか。
    また、引数はフルパスで指定されていますか?


    > やはり、wifiの接続あたりが怪しいでしょうか?

    そのように判断するための根拠が何も無い状態なので、
    現時点では Yes とも No とも言えないところですね…。


    アプリの再起動で復帰できるのであれば、ファイルコピー部分だけを
    別プロセスに分離して凌ぐという手段も。
引用返信 削除キー/
■34277 / inTopicNo.5)  Re[4]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ オフィスケイ 一般人(1回)-(2019/07/04(Thu) 08:18:24)
  • アイコンNo34276に返信(魔界の仮面弁士さんの記事)
    >
    > 例外の発生地点は、File.Copy メソッドで間違いありませんか?
    > 比較的広い範囲にわたって Try ブロックが置かれているようなので。
    => File.Copyの直前にログを出力していて、File.Copy後にもログを出力していますので、File.Copyがあやしいとみています。
    下記にログを記載します。
      143333 I [fnc_LogDataSend] 履歴データ送信_ファイル存在チェック(File.Exists)
      143333 I [fnc_LogDataSend] 履歴データ送信_ファイルcopy前(File.copy)
      143528 E [fnc_LogDataSend] アップロード(履歴データ送信)に失敗しました。IOException


    >
    > また、エラー発生時点の StackTrace を記録することは出来ますか?
    > (Exception の ToString でも OK です)
    >
    >
    > 日本語ランゲージパック(Microsoft .NET CF 3.5 JA-String Resource)も
    > 検証環境にインストールしておいた方が調べやすいかもしれません。
    > (無くても動きますが、例外メッセージの中身が変わってくる可能性がある)
    >
      => 今回の現象が発生しているのはユーザー先のPDAなのです。
        開発用のPDAでもcopy先はネットワーク越し、copy元はPDAのローカルなのですが、1度もエラーが出ていない状態です。

    >
    > 正常時と失敗時で Directory.GetCurrentDirectory の値は同じでしょうか。
    > また、引数はフルパスで指定されていますか?
     => そうですね。どちらも同じで、フルパスで指定しています。
    >

引用返信 削除キー/
■34278 / inTopicNo.6)  Re[5]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ 魔界の仮面弁士 大御所(1233回)-(2019/07/04(Thu) 10:37:57)
  • アイコンNo34277に返信(オフィスケイさんの記事)
    > 下記にログを記載します。
    >   143333 I [fnc_LogDataSend] 履歴データ送信_ファイル存在チェック(File.Exists)
    >   143333 I [fnc_LogDataSend] 履歴データ送信_ファイルcopy前(File.copy)
    >   143528 E [fnc_LogDataSend] アップロード(履歴データ送信)に失敗しました。IOException

    その時間に母艦へのコピー操作が正常に行われたのか、
    コピー途中で失敗したのか(セキュリティソフトによる阻害や無線Hubの不調)、
    あるいはそもそも母艦への Copy 要求すら行われなかったのかが
    わかるような仕掛けがあると、原因の追跡に役立つかもしれません。

    ユーザー環境でのみ発生する事象という事で追跡しにくいですが、
    母艦(ファイル送信先)側で監査ログを取るようにして、
    例外が発生した時刻付近のイベント ビューワーのログが、
    いつもと違う内容になっていないか確認してみては如何でしょう。
    http://eventlog.whitefox.jp/?eid=5
    http://hokatsu.net/windows/detect_file_edit_and_deletion/
引用返信 削除キー/
■34279 / inTopicNo.7)  Re[1]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ kiku 一般人(6回)-(2019/07/04(Thu) 11:39:42)
  • アイコン直接的な回答ではありませんが、
    経験したことを羅列します。

    ●CE6.0でのはなし。
    ・共有フォルダ経由にてファイルをアップロードを行ったことがあります。
     同じように原因不明なエラーが発生したりし、
     通信を追うことができるFTP通信に変更することで対処しました。

    ●Window7以降のはなし
    ・共有フォルダを経由し、ファイルをアップロードすることをやっています。
     無線LAN環境が悪く、切断が頻繁に発生する状況です。
     同じように、ネットワークフォルダの確認、コピー先に同名の
     ファイルが存在しないことを確認してからコピーを行いますが
     Exceptionが発生することがあります。
     対処としては、2つ行い、安定しました。
     1.共有フォルダのEveryOneにしていたのですが
       ユーザとパスワードを指定して、共有フォルダへの認証を
       行うように変更しました。
       何か失敗した場合、再度認証を行う対処になります。
     2.例外が発生した場合、再送を行うように実装しました。
       1.共有フォルダのPCにPINGを発行し、OKになるまで繰り返す
       2.共有フォルダへの再認証(再ログイン)
       3.フォルダの存在チェック
       4.ファイルの存在チェック
       5.コピー

    CE6.0で共有フォルダを利用したいのであるならば、
    PCで行った対処を行うのが良い気がします。



引用返信 削除キー/
■34280 / inTopicNo.8)  Re[6]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ オフィスケイ 一般人(2回)-(2019/07/10(Wed) 08:05:16)
  • アイコンNo34278に返信(魔界の仮面弁士さんの記事)

    > ユーザー環境でのみ発生する事象という事で追跡しにくいですが、
    > 母艦(ファイル送信先)側で監査ログを取るようにして、
    > 例外が発生した時刻付近のイベント ビューワーのログが、
    > いつもと違う内容になっていないか確認してみては如何でしょう。



    =>ご回答ありがとうございます。
     監査ログを取るなどして、もう少し調べてみたいと思います。


引用返信 削除キー/
■34281 / inTopicNo.9)  Re[2]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ オフィスケイ 一般人(3回)-(2019/07/10(Wed) 08:07:18)
  • アイコンNo34279に返信(kikuさんの記事)
    >
     回答ありがとうございます。
     ご提示して頂いた内容を踏まえ、いろいろとやってみたいと思います。
     ありがとうございました。
引用返信 削除キー/
■34282 / inTopicNo.10)  Re[4]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ オフィス・ケイ 一般人(2回)-(2019/07/16(Tue) 13:13:25)
  • アイコンNo34276に返信(魔界の仮面弁士さんの記事)
    > ■No34275に返信(オフィス・ケエイさんの記事)
    >
    > また、エラー発生時点の StackTrace を記録することは出来ますか?
    > (Exception の ToString でも OK です)

    => 下記にExceptionのToStringを取りました。

    System.IO.IOException:
    IOException
    場所 System.IO.__Error.WinIOError(Int32 errorCode, String str)
    場所 System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite)
    場所 〇〇.mod_〇〇.fnc_LogDataSend(String& sErrMsg, StatusBar stbMsg)
    場所 〇〇.frm01_Main.ProcUpLoad()
    場所 〇〇.frm01_Main.btnSave_Click(Object sender, EventArgs e)
    場所 System.Windows.Forms.Control.OnClick(EventArgs e)
    場所 System.Windows.Forms.Button.OnClick(EventArgs e)
    場所 System.Windows.Forms.ButtonBase.WnProc(WM wm, Int32 wParam, Int32 lParam)
    場所 System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
    場所 Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain)
    場所 System.Windows.Forms.Application.Run(Form fm)
    場所 〇〇.mod_〇〇.Main()

    ※〇〇はユーザー名が入っているので、隠しますね。

    この内容で何かわかりますでしょうか?


引用返信 削除キー/
■34288 / inTopicNo.11)  Re[5]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ 魔界の仮面弁士 大御所(1236回)-(2019/07/30(Tue) 11:49:55)
  • アイコン2019/07/30(Tue) 11:50:26 編集(投稿者)

    No34282に返信(オフィス・ケイさんの記事)
    > System.IO.IOException:
    > IOException
    > 場所 System.IO.__Error.WinIOError(Int32 errorCode, String str)
    > 場所 System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite)
    > 場所 〇〇.mod_〇〇.fnc_LogDataSend(String& sErrMsg, StatusBar stbMsg)


    File.InternalCopy が呼ばれるのは、
    System.IO.File の Copy メソッドもしくは
    System.IO.FileInfo の CopyTo メソッドのいずれかですね。

    そして、InternalCopy が直接 __Error.WinIOError を呼び出す箇所は、
    No34274 で言う所の 3 または 13 のいずれかしかなく、
    最終結果が IOException であることから、13 であったと思われます。

    ただ、CopyFile API がどうしてそういう errorCode を吐いたのかは不明のまま…。


    No34275に返信(オフィス・ケエイさんの記事)
    > また、その後はリトライしても同様にIOExceptionで落ちます。
    >  プログラムを一旦終了し、再度起動させるとうまくいきます。

    通信障害などで失敗した時に、それを引きずってしまうのかな…。

    アプリケーションの再起動で回避できるようなので、
    No34276 の最後に書いたように、ファイルコピー用の exe を用意し、
    System.Diagnostics.Process.Start で呼び出す方式でリトライするとか。

    .NET Compact Framework 1.0 では Process クラスが無いけれど、
    .NET Compact Framework 2.0 以降なら使えるはず。
引用返信 削除キー/
■34292 / inTopicNo.12)  Re[3]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ オフィス・ケイ 一般人(3回)-(2019/08/02(Fri) 08:09:08)
  • アイコンお世話になります。

    file.copyに失敗したとき、
    現状は1回の失敗でエラーを出力して終わっていましたが
    何回かリトライしてそれでもだめだったらエラーを吐き出す。
    ように修正して様子を見てみます。

    回答を頂いた皆様ありがとうございました。

    この件は一旦解決済みとさせていただきます。

解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -