none
ファイル共有したサーバーへファイル転送したい RRS feed

  • 質問

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

    Windows XP SP3、C#2005の環境でWindows Formアプリケーションを
    製造しています。
    サーバーはWindows Server 2003 SP2です。

    サーバーに共有フォルダを作って、
    そこでWindows XPのクライアントからファイル転送をしたいと思っています。

    ネットワークドライブは作りたくないなと思っていまして、
    またWindows Server 2003には、何もインストールしたくないと思っています。
    (FTPはインストールしたくないと思っています。IISはインストールされています。)

    ファイルはダウンロードする必要はなく、アップロードだけできれば良いのですが、
    同じファイル名のファイルがある場合には、更新したいという要件もあります。

    このような場合、どのようにして、
    ファイル転送のプログラムを作るのが良いのでしょうか?
    サーバーのIDとパスワードを指定して、ファイル転送するのだと思うのですが、
    どのように調べて良いかが分からず、プログラムを書くことができず困っております。

    もしよろしければ、アドバイス頂けませんか?
    ぜひよろしくお願いいたします。

    2009年12月1日 15:41

回答

  • >ネットワークドライブは作りたくないなと思っていまして、

    必要ないです。

    PC1 に共有フォルダ Share が作成済みなら

    \\PC1\Share

    という UNC 名でアクセス可能です。

    クライアント端末 PC2 から PC1 が公開する共有フォルダ Share へのファイル転送は、普通に

    string src = @"C:\file1.txt";
    string dst = @"\\PC1\Share\file1.txt";

    System.IO.File.Copy(src, dst, true);

    でおkです。

    ただしこれは、クライアント端末に \\PC1\Share へのアクセス権のあるアカウントでログオンしている場合です。

    ワークグループ環境の場合、Copy の前に PC1 への接続認証が必要です。(パススルーが機能する場合もあるけど)

    >URIはfile:スキームをサポートしていると思いますので、試していませんが、以下で共有フォルダにもファイルを転送できるのではないかと思います。

    URI が file スキームを持つかどうかと、WebCliet クラスがそれをサポートするかどうかは別の話ですね。

    WebClient クラスがサポートするプロトコルは HTTP(HTTPS), FTP, Gopher(してなかったっけ?) だけのはず。
    • 回答としてマーク コンドル 2009年12月4日 10:01
    2009年12月2日 3:04
    モデレータ
  • 外池です。

    なるほど、普段(WindowsのExplorer)からファイル共有で見えている相手なら、渋木さんの仰るようにSystem.IO.File.Copy(src, dst, true)が一番簡単だと思います。

    あと「IDとパスワードを聞かれてしまう環境のため」の部分がネックなわけですね。ざっと3つのパターンがあるかと思いますが・・・。

    1)まずユーザーがExplorerを通じてIDとパスワードを入力する作業を行って、その後、ファイルをアップロードするプログラムを走らせるのであれば、プログラムでIDやパスワードを扱う必要はありません。(一番簡単ですが、これは、たぶん、無いんだろうな・・・)

    2)プログラムを走らせて、プログラムがユーザーからIDとパスワードを受け取って、認証する作業を行って、その後、ファイルのコピーをする。この場合、今、私が思いつくのは、認証作業をコマンドプロンプトのnet useコマンドを使うことぐらいしかないのですが・・・、比較的簡単にできると思います。

    3)最初からプログラムにIDとパスワードを仕込んでおいて(設定ファイルのようなものを別途用意しておいてもよい)、自動的に認証も行い、その後、ファイルをコピーする。これも、認証作業は上述のとおりできると思うのですが、問題は、IDとパスワードの保管方法ですね。どうやって安全に保管するか・・・。暗号化かなぁ。

    かなり弱い回等で申し訳ありません。ヒントになれば幸いです。


    (ホームページを再開しました)
    • 回答としてマーク コンドル 2009年12月4日 10:01
    2009年12月2日 8:12
  • >今、私が思いつくのは、認証作業をコマンドプロンプトのnet useコマンドを使うことぐらいしかないのですが・・・、比較的簡単にできると思います。

    WNetAddConnection1() ~ WNetConnection3() API を使えば、もっとプログラムチックに実現できます。
    • 回答としてマーク コンドル 2009年12月4日 10:00
    2009年12月2日 13:11
    モデレータ
  • > 「IIS」はサーバーをWebサーバーとして利用しておりまして、
    > ASP.NETが動いており、そのために使用しています。
    > (今回は使用しないため、関係ないと思っております。)

    その Web サーバーに、Windows Formアプリケーションからアップロードされたファイルを受け
    て「共有フォルダ」に書き込む Web アプリケーションを実装するという方法もあります。

    興味があれば以下のサイトを見てください。

    WebClient.UploadFile メソッド (String, String)
    http://msdn.microsoft.com/ja-jp/library/36s52zhs.aspx

    POSTでデータを送信する
    http://dobon.net/vb/dotnet/internet/webrequestpost.html

    > 共有フォルダへはアクセスできる環境なのですが、
    > IDとパスワードを聞かれてしまう環境のため、
    > (ドメイン管理していないため)
    > この場合は、どのようにプログラムして良いかが分かりませんでした。

    Web アプリケーションの動くアカウント(デフォルトでは NETWORK SERVICE)に共有フォルダ
    に対するアクセス権を与えておいて、Web サイトには匿名アクセスを許可しておけば、そのあた
    りは解決できるかと思います。


    もっとスマートで簡単な方法もあるでしょうから、上記のような方法は実際あまり役に立たないと
    は思いますが、こんな方法もあるということで、ご参考まで。

    • 回答としてマーク コンドル 2009年12月4日 10:01
    2009年12月2日 14:17

すべての返信

  • 外池と申します。すいません、何がわからないのかが伝わってこないので、困ってしまいます。

    そもそも、サーバーとクライアントの間はどのように接続されているのでしょうか? 「共有フォルダ」の機能が働くような接続になっているのか? 「FTP」が通るのか? などなどです。この点について、ご理解されていますか?

    「共有フォルダ」、「FTP」、「IIS」という言葉を挙げておられますが、これらの用語自体はご理解されていますでしょうか? これらの機能が、.Net Frameworkのクラスライブラリーのどのクラスと対応するのか? という点で重要なのですが。

    次に、.Net Frameworkにネットワーク関連や、ファイル操作関連のクラスが多数用意されていますが、その点はご理解されていますか? ドキュメントがお手元にありますか

    これらの項目ごとに、現状とやりたいことを順を追ってご説明頂かないと、どうにも・・・・。

    実のところ、「共有フォルダ」の機能が通るネット環境なら、.Net Frameworkのクラスライブラリーを使ってファイルの転送はものすごく簡単にできます。わざわざ「FTP」というようなことを仰るということは、「共有フォルダ」が働かない環境なのかな? とも勝手に想像しちゃいますし。
    (ホームページを再開しました)
    2009年12月2日 0:17
  • 外池様

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

    説明が分かりづらくて、申し訳ございません。

    >そもそも、サーバーとクライアントの間はどのように接続されているのでしょうか?
    >「共有フォルダ」の機能が働くような接続になっているのか?
    > 「FTP」が通るのか? などなどです。この点について、ご理解されていますか?
    サーバーとクライアントの間はLANでつながっています。
    同一ネットワークにいまして、サーバー側のフォルダに共有設定をしていますので、
    クライアントからサーバーのフォルダを見ることができます。
    ただし、IDとパスワードが聞かれます。
    サーバーにはFTPの機能をインストールしていませんので、FTPが通ることはないと
    思っています。

    >「共有フォルダ」、「FTP」、「IIS」という言葉を挙げておられますが、これらの用語自体はご理解されていますでしょうか?
    足りない部分があるかもしれませんが、基本的には理解はしていると思っております。
    「IIS」はサーバーをWebサーバーとして利用しておりまして、
    ASP.NETが動いており、そのために使用しています。
    (今回は使用しないため、関係ないと思っております。)

    >次に、.Net Frameworkにネットワーク関連や、ファイル操作関連のクラスが多数用意されていますが、その点はご理解されていますか? ドキュメントがお手元にありますか
    ネットワーク関連のクラスを理解していないかもしれません。
    ファイル操作はFileクラスの起動で、ファイルの移動や削除をしたら良いかと
    思っております。

    共有フォルダへはアクセスできる環境なのですが、
    IDとパスワードを聞かれてしまう環境のため、
    (ドメイン管理していないため)
    この場合は、どのようにプログラムして良いかが分かりませんでした。

    分かりづらい説明で申し訳ございませんでした。
    よろしくお願いいたします。

    2009年12月2日 0:47
  • URIはfile:スキームをサポートしていると思いますので、試していませんが、以下で共有フォルダにもファイルを転送できるのではないかと思います。

    WebClientクラスでFTPによりファイル転送を行うには?[2.0のみ、C#、VB]
    http://www.atmarkit.co.jp/fdotnet/dotnettips/459ftpwc/ftpwc.html

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年12月2日 1:54
    モデレータ
  • >ネットワークドライブは作りたくないなと思っていまして、

    必要ないです。

    PC1 に共有フォルダ Share が作成済みなら

    \\PC1\Share

    という UNC 名でアクセス可能です。

    クライアント端末 PC2 から PC1 が公開する共有フォルダ Share へのファイル転送は、普通に

    string src = @"C:\file1.txt";
    string dst = @"\\PC1\Share\file1.txt";

    System.IO.File.Copy(src, dst, true);

    でおkです。

    ただしこれは、クライアント端末に \\PC1\Share へのアクセス権のあるアカウントでログオンしている場合です。

    ワークグループ環境の場合、Copy の前に PC1 への接続認証が必要です。(パススルーが機能する場合もあるけど)

    >URIはfile:スキームをサポートしていると思いますので、試していませんが、以下で共有フォルダにもファイルを転送できるのではないかと思います。

    URI が file スキームを持つかどうかと、WebCliet クラスがそれをサポートするかどうかは別の話ですね。

    WebClient クラスがサポートするプロトコルは HTTP(HTTPS), FTP, Gopher(してなかったっけ?) だけのはず。
    • 回答としてマーク コンドル 2009年12月4日 10:01
    2009年12月2日 3:04
    モデレータ
  • 外池です。

    なるほど、普段(WindowsのExplorer)からファイル共有で見えている相手なら、渋木さんの仰るようにSystem.IO.File.Copy(src, dst, true)が一番簡単だと思います。

    あと「IDとパスワードを聞かれてしまう環境のため」の部分がネックなわけですね。ざっと3つのパターンがあるかと思いますが・・・。

    1)まずユーザーがExplorerを通じてIDとパスワードを入力する作業を行って、その後、ファイルをアップロードするプログラムを走らせるのであれば、プログラムでIDやパスワードを扱う必要はありません。(一番簡単ですが、これは、たぶん、無いんだろうな・・・)

    2)プログラムを走らせて、プログラムがユーザーからIDとパスワードを受け取って、認証する作業を行って、その後、ファイルのコピーをする。この場合、今、私が思いつくのは、認証作業をコマンドプロンプトのnet useコマンドを使うことぐらいしかないのですが・・・、比較的簡単にできると思います。

    3)最初からプログラムにIDとパスワードを仕込んでおいて(設定ファイルのようなものを別途用意しておいてもよい)、自動的に認証も行い、その後、ファイルをコピーする。これも、認証作業は上述のとおりできると思うのですが、問題は、IDとパスワードの保管方法ですね。どうやって安全に保管するか・・・。暗号化かなぁ。

    かなり弱い回等で申し訳ありません。ヒントになれば幸いです。


    (ホームページを再開しました)
    • 回答としてマーク コンドル 2009年12月4日 10:01
    2009年12月2日 8:12
  • >今、私が思いつくのは、認証作業をコマンドプロンプトのnet useコマンドを使うことぐらいしかないのですが・・・、比較的簡単にできると思います。

    WNetAddConnection1() ~ WNetConnection3() API を使えば、もっとプログラムチックに実現できます。
    • 回答としてマーク コンドル 2009年12月4日 10:00
    2009年12月2日 13:11
    モデレータ
  • > 「IIS」はサーバーをWebサーバーとして利用しておりまして、
    > ASP.NETが動いており、そのために使用しています。
    > (今回は使用しないため、関係ないと思っております。)

    その Web サーバーに、Windows Formアプリケーションからアップロードされたファイルを受け
    て「共有フォルダ」に書き込む Web アプリケーションを実装するという方法もあります。

    興味があれば以下のサイトを見てください。

    WebClient.UploadFile メソッド (String, String)
    http://msdn.microsoft.com/ja-jp/library/36s52zhs.aspx

    POSTでデータを送信する
    http://dobon.net/vb/dotnet/internet/webrequestpost.html

    > 共有フォルダへはアクセスできる環境なのですが、
    > IDとパスワードを聞かれてしまう環境のため、
    > (ドメイン管理していないため)
    > この場合は、どのようにプログラムして良いかが分かりませんでした。

    Web アプリケーションの動くアカウント(デフォルトでは NETWORK SERVICE)に共有フォルダ
    に対するアクセス権を与えておいて、Web サイトには匿名アクセスを許可しておけば、そのあた
    りは解決できるかと思います。


    もっとスマートで簡単な方法もあるでしょうから、上記のような方法は実際あまり役に立たないと
    は思いますが、こんな方法もあるということで、ご参考まで。

    • 回答としてマーク コンドル 2009年12月4日 10:01
    2009年12月2日 14:17
  • 皆様、たくさんのご回答ありがとうございます。

    まだ試しておりませんが、
    net useのコマンドでWindows認証をさせて、
    USC名でアクセスしようと思っております。
    これが要件と大変さを考えると、1番妥当だろうと思いました。

    実際に行い次第、報告させて頂きます。
    とても参考になりました。
    ありがとうございます。

    2009年12月2日 16:46
  • WebClient クラスがサポートするプロトコルは HTTP(HTTPS), FTP, Gopher(してなかったっけ?) だけのはず。
    とりあえず試してみました。System.Net.WebClientを使い、
    webClient.UploadFile(@"\\server\hoge\fuga.txt", @"c:\work\fuga.txt");
    で、共有フォルダに書き込まれました。裏でどのようなプロトコルが使われているのかはわかりませんが・・・
    (追記)
    あ~、でもfuga.txtの中身が文字化けしてた。orz

    #CredentialCacheを使っても認証が通らないんだよなぁ・・・・・。ひょっとしてイレギュラーかな?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年12月3日 8:32
    モデレータ
  • 皆様ありがとうございました。

    NET USEコマンドを使ってWindows認証をさせて、
    USC名でアクセスすることで解決しました。

    載せるまでもないですが、NET USEコマンドは以下のサイトを参考にしました。
    >net useコマンドを使ってワークグループ環境で事前にWindows認証を受ける
    http://itpro.nikkeibp.co.jp/article/COLUMN/20060725/244265/

    ありがとうございました。
    2009年12月4日 10:00