ファイルコピーでエラー処理を行うには?

解決


xyz  2004-02-19 23:36:08  No: 111926

Windows.Formsでローカルではなくサーバーにファイルをコピーしております。
FTPでも良かったのですが、コピーできたのでコピーにしてます。
FTPのやり方もいまいち分からなかったので。。。
っで、今回行いたい処理は、
コピーに失敗した場合。
例:コピー先のサーバーが落ちていてコピーできなかったなど
出来ればコピーに失敗した場合と
サーバーが落ちているかネットワークに繋がっていないなど通信部分で
エラーメッセージを変えたいのですが、そのようなことは可能なのでしょうか??
エラー処理については全く分かっていないので、
これを機に色々と勉強したいと思います。
どなたかご教授をお願い致します。
ちなみにWinXPのVB.Netでサーバー側はWin2000です。


岡田 之仁  2004-02-19 23:44:36  No: 111927

多分・・・サーバー側のフォルダ等を共有化して、ローカル側が
仮想ドライブとしてマウントした形だと思いますが・・・

FileInfo、DirectoryInfoとかのクラスを使って、そのドライブ
の中(フィルダの中)を検索動作させ、ファイルのあるなしを
確認してやればよいかと・・・コピー動作も、FileInfoでできま
すし・・・

ですが、要注意!
長時間その仮想ドライブにアクセスしないと、ローカル側の仮想
ドライブに赤バッテンがつきます。
その状態でコピー動作を行いますと、エラーしないで終了したり
します。無理やりDirectoryInfoでファイル情報を取得しても回復
しない場合があります。作業者が、エクスプローラやマイコンピュ
ータから、そのドライブアイコンをクリックして、開けば回復する
(再接続)するのですが・・・これをプログラム的に行うことが、
私にはできなかったので、コピー動作を必要とするたびに、毎回、
共有フォルダの共有、仮想ドライブ化、ファイルのコピー、共有
フォルダの解除と言う動作を繰り返し、必ずサーバーと接続が正常
になるようにしています。

共有フォルダの関係のAPIでは・・・
    ' ネットワークリソースに接続する関数の宣言
    Public Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (ByVal lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long
    ' 「ネットワークドライブの切断」ダイアログを表示する関数の宣言
    Declare Function WNetDisconnectDialog1 Lib "mpr.dll" Alias "WNetDisconnectDialog1A" (ByVal lpConnectDlgStruc As DISCDLGSTRUCT) As Long
を使いました。

ご参考までに・・・

以上。


xyz  2004-02-19 23:59:57  No: 111928

岡田 之仁さん。お久しぶりです。
先日はお世話になりました。

サーバー側のコピー先フォルダは確かに共有化されてます。
これを前提にコピーを行っていますが、コピーするファイルは
1〜255のどれかの数字.htmlのパターンのファイルです。
なのでファイルが存在するかどうかでは
エラーかどうかの判断基準になりません。
更新日時とかを見るしかないですかね?それはそれで問題ありますよね。

あと
Dim myWriter As StreamWriter
myWriter = New StreamWriter(IndexPath1)
myWriter.Write(indexHtm)
myWriter.Close()
(IndexPathはサーバー上のhtmlファイルを指してます。)
でHtmlをを作成してますが・・・危険ですか??


岡田 之仁  2004-02-20 00:41:55  No: 111929

そういう意味であれば・・・

FileInfo で、仮想ドライブでのファイルのフルパスを
渡して、ファイル情報を取得して自分で判断した方が
いいとは思います。

        Dim fiSrc As FileInfo
        Dim fiDst As FileInfo
        Dim szSrcPath As String
        Dim szDstPath As String
        Dim bRet As Boolean

        szSrcPath = "xxxxx"      ' ローカル側
        szDstPath = "yyyyy"      ' サーバー側

        bRet = False

        fiSrc = New FileInfo(szSrcPath)
        fiDst = New FileInfo(szDstPath)

        If fiSrc.Exists Then
            If fiDst.Exists Then
                If fiSrc.LastAccessTime > fiDst.LastAccessTime Then
                    ' ローカル側が最新の場合
                    bRet = True
                End If
            Else
                ' サーバー側にファイルが無い場合
                bRet = True
            End If
        End If

        If bRet Then
            ' コピーを行う
            Try
                fiSrc.CopyTo(szDstPath, True)
            Catch ex As Exception
                Debug.WriteLine("コピー失敗(" + ex.Message + ")")
            End Try
        End If

こんなんでどうでしょうか・・・
パスの設定はして下さい。

尚、先の長時間アクセスしない場合の処置は、
お考え下さい。

以上。


xyz  2004-02-21 00:18:46  No: 111930

いつもお世話になっております。

長時間アクセスしない場合の処置なのですが
いまいちよく分からずで。。。
色々と調べてやってみたのですが、これはマイコンピュータには
表示されませんか?されるのなら間違っているんですよね。。。

一応、色々と試してみます。
長時間アクセスしないことはないとは思いますが。。。

ありがとうございました。


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

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






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