C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: サーバ上の共有ファイルへのアクセス


(過去ログ 64 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■37019 / inTopicNo.1)  サーバ上の共有ファイルへのアクセス
  
□投稿者/ ゼン (1回)-(2009/06/11(Thu) 14:49:55)

分類:[.NET 全般] 

こんにちは、VB.NET初心者のゼンです。

早速ですが質問をさせてください。

ファイルサーバの共有フォルダ内のファイルをローカルマシンにコピーするプログラムを作成しております。

サーバへの接続が確立している時はファイルのコピーをする事が出来るのですが、接続状態を調べる方法と接続する方法がわかりません。

どなたかご指導をお願い致します。

ちなみにコピーする部分のコードは以下の通りです。

こんにちは、VB.NET初心者のゼンです。

早速ですが質問をさせてください。

ファイルサーバの共有フォルダ内のファイルをローカルマシンにコピーするプログラムを作成しております。

サーバへの接続が確立している時はファイルのコピーをする事が出来るのですが、接続状態を調べる方法と接続する方法がわかりません。

どなたかご指導をお願い致します。

ちなみにコピーする部分のコードは以下の通りです。

    Sub Main()

        'サーバのIPアドレス
        Const SERVER_IP As String = "172.xx.xx.xx"

        'サーバの共有フォルダのパス
        Const SERVER_DIRECTORY As String = "C:\Test\"

        'ローカルのコピー先フォルダのパス
        Const LOCAL_DIRECTORY As String = "D:\Test\"

        'サーバのコピー先のパスを設定します。
        Dim serverPath As String = System.IO.Path.Combine(SERVER_IP, SERVER_DIRECTORY)

        'サーバのディレクトリ内を走査します。
        For Each serverFilePath As String In System.IO.Directory.GetFiles(serverPath)

            'ファイル名を取得します。
            Dim fileName As String = System.IO.Path.GetFileName(serverFilePath)

            'ファイルをコピーします。
            System.IO.File.Copy(serverFilePath, System.IO.Path.Combine(LOCAL_DIRECTORY, fileName))

        Next

    End Sub

開発環境
クライアントOS:WindowsXP
サーバOS:Windows2003
使用言語:VB2005

引用返信 編集キー/
■37023 / inTopicNo.2)  Re[1]: サーバ上の共有ファイルへのアクセス
□投稿者/ aetos (156回)-(2009/06/11(Thu) 16:29:50)
aetos さんの Web サイト
No37019 (ゼン さん) に返信
> サーバへの接続が確立している時はファイルのコピーをする事が出来るのですが、接続状態を調べる方法と接続する方法がわかりません。

え、このコードは、接続済みであれば動くのですか?
ちょっとそうは思えないんですけど…。

動いているとして、それは本当にサーバーからファイルを取ってきていますか?
実は同じ PC 上の C ドライブから D ドライブにファイルをコピーしていたりしませんか?
# ぢっけん:Console.WriteLine( Path.Combine("192.168.0.1", @"C:\Test\") ); の結果は "C:\Test\" でした。

共有フォルダが Windows のファイル共有のことを指すなら、サーバ上のフォルダパスは \\サーバ名\共有名\パス という形式で指定します。
サーバにログインするために認証が必要な場合は、WNetAddConnection3 API を使う必要があるらしいです。
# この辺は最近はもっと楽な方法が出てきていたりしないのでしょうか?>識者の方

さて、その上で、
> 接続状態を調べる
というのは通常やりません。
なぜなら、調べて OK と判断される時点と、実際にアクセスする時点の間にはわずかとはいえ間隔があり、この間にネットワークが切断されないとは言い切れないからです。
一般に、ネットワークやファイル等の I/O を行う際は、事前確認をせず、「試しに繋いでみる」というのをやります。
うまく繋がればそれでよし、繋がらなかったらそれなりのエラー処理をします。

というのが原則なのですが、それはそれとして、参考程度に知りたい場合は、Systen.Net.NetworkInformation 名前空間にいろいろとあります。
http://msdn.microsoft.com/ja-jp/library/ms229714(VS.80).aspx
引用返信 編集キー/
■37085 / inTopicNo.3)  Re[2]: サーバ上の共有ファイルへのアクセス
□投稿者/ ゼン (2回)-(2009/06/12(Fri) 14:15:36)
No37023 (aetos さん) に返信
> 動いているとして、それは本当にサーバーからファイルを取ってきていますか?
> 実は同じ PC 上の C ドライブから D ドライブにファイルをコピーしていたりしませんか?
> # ぢっけん:Console.WriteLine( Path.Combine("192.168.0.1", @"C:\Test\") ); の結果は "C:\Test\" でした。
ご返信ありがとうございます。

記述に間違いがありました。
実際に動いているソースから抜粋修正して掲示板に載せたのですが、その際に記述ミスがあったようです。

'サーバの共有フォルダのパス
    × Const SERVER_DIRECTORY As String = "C:\Test\"
    ○ Const SERVER_DIRECTORY As String = "C\Test\"

"C:〜"では無く"C〜"でパス連結をしております。
Path.Combine("\\192.168.0.1","C\Test\")
上記の記述ならばサーバ上の共有フォルダのパスが返ってきます。

> 共有フォルダが Windows のファイル共有のことを指すなら、サーバ上のフォルダパスは \\サーバ名\共有名\パス という形式で指定します。
> サーバにログインするために認証が必要な場合は、WNetAddConnection3 API を使う必要があるらしいです。
私自身で調べてみた結果もAPI WNetAddConnection3を使ってネットワークドライブを張る手段しか見当たりませんでした。

> # この辺は最近はもっと楽な方法が出てきていたりしないのでしょうか?>識者の方
>
> さて、その上で、
>>接続状態を調べる
> というのは通常やりません。
> なぜなら、調べて OK と判断される時点と、実際にアクセスする時点の間にはわずかとはいえ間隔があり、この間にネットワークが切断されないとは言い切れないからです。
> 一般に、ネットワークやファイル等の I/O を行う際は、事前確認をせず、「試しに繋いでみる」というのをやります。
> うまく繋がればそれでよし、繋がらなかったらそれなりのエラー処理をします。
>
> というのが原則なのですが、それはそれとして、参考程度に知りたい場合は、Systen.Net.NetworkInformation 名前空間にいろいろとあります。
> http://msdn.microsoft.com/ja-jp/library/ms229714(VS.80).aspx

なるほど。
試しに繋いでみて例外処理を考えるという方法が一般的なんですね。
ありがとうございます。
ご指摘されるまで気付けなかったです。
(初心者で申し訳ありません。)
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -