DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ネットワーク経由でファイルをコピーするには

環境/言語:[Framework1.1SP1 C#]
分類:[.NET]

http://dobon.net/vb/dotnet/file/filecopy.html
↑を参考にネットワーク経由でファイルをコピーしたいと思っています。
しかし単純に
「System.IO.File.Copy("\\netserver\test.txt", "C:\test.txt", True)」
              ↑コピー元のサーバ(コンピュータ)名
とすると
'System.IO.IOException' のハンドルされていない例外が mscorlib.dll で発生しました。
追加情報 : ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。

とエラーになります。名前解決、アクセス制限、ファイアウォールを切る等の対応はしてるのですが、エラーになっていまします。
ネットワーク経由でコピーする方法をお願いします。
■No19205に返信(蟹バサミさんの記事)

> 'System.IO.IOException' のハンドルされていない例外が mscorlib.dll で発生しました。
> 追加情報 : ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。

読んで字のごとし、ではないでしょうか。

ネットワーク上のファイルは以下のような構成になっているはずです。

 \\コンピュータ名\共有名\(ディレクトリ名\)ファイル名

共有名が抜けていませんか?
>  \\コンピュータ名\共有名\(ディレクトリ名\)ファイル名
すいません。例えが悪かったですね。
ちゃんと\\コンピュータ名\共有名\ディレクトリ名\ファイル名という構成にしています。
もちろんファイル名、ディレクトリ名やコンピュータ名なども全てチェックしております。
■No19207に返信(蟹バサミさんの記事)
>> \\コンピュータ名\共有名\(ディレクトリ名\)ファイル名
> すいません。例えが悪かったですね。
> ちゃんと\\コンピュータ名\共有名\ディレクトリ名\ファイル名という構成にしています。
> もちろんファイル名、ディレクトリ名やコンピュータ名なども全てチェックしております。
>
環境がC#でみたいなので、\マークがエスケープされてないのではないでしょうか。

> System.IO.File.Copy("\\netserver\test.txt", "C:\test.txt", True);

System.IO.File.Copy(@"\\netserver\test.txt", @"C:\test.txt", True);
2007/03/01(Thu) 12:08:21 編集(投稿者)

■No19205に返信(蟹バサミさんの記事)
> 環境/言語:[Framework1.1SP1 C#] 

C# なのですよね?

> 「System.IO.File.Copy("\\netserver\test.txt", "C:\test.txt", True)」
>               ↑コピー元のサーバ(コンピュータ)名

この文字列は、逐語的リテラルでないので、'\t' がエスケープ シーケンスになります。
そうなると当然、下記のような例外が発生して然りです。

> 'System.IO.IOException' のハンドルされていない例外が mscorlib.dll で発生しました。
> 追加情報 : ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。

やはり、読んで字のごとし、ではないでしょうか。

ところで、

> 「System.IO.File.Copy("\\netserver\test.txt", "C:\test.txt", True)」

最後の引数 "True" を見ると VB のようにも見えます。
これでは、どちらで答えて良いのかわかりません。

質問の情報が正しくなければ、答えも正しいものは返ってこなくなるでしょう。

# 余計なこと書いていたら、出遅れた && かぶった。
■No19211に返信(じゃんぬねっとさんの記事)

>>「System.IO.File.Copy("\\netserver\test.txt", "C:\test.txt", True)」
>>              ↑コピー元のサーバ(コンピュータ)名
>
> この文字列は、逐語的リテラルでないので、'\t' がエスケープ シーケンスになります。
> そうなると当然、下記のような例外が発生して然りです。

なるほど、エスケープされてなければ実行時エラーどころかコンパイルすら
通らないんじゃないのかなあと思ってスルーしてしまっていましたが、\\ と \t
だから 『とりあえず』 コンパイルだけは通っちゃうんですね。

"\\netserver\test.txt", "C:\test.txt"

"\netserver(tab)est.txt", "C:(tab)est.txt"

という感じに解釈されていると。
そしたらやはり

> 'System.IO.IOException' のハンドルされていない例外が mscorlib.dll で発生しました。
> 追加情報 : ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。

になりますね。TABはファイル名には使用できませんから。


■No19207に返信(蟹バサミさんの記事)

>> \\コンピュータ名\共有名\(ディレクトリ名\)ファイル名
> すいません。例えが悪かったですね。
> ちゃんと\\コンピュータ名\共有名\ディレクトリ名\ファイル名という構成にしています。
> もちろんファイル名、ディレクトリ名やコンピュータ名なども全てチェックしております。

共有名も入っていましたか。それはどうもすいませんでした。
でも、書かれていなかったので私には伝わりませんでしたね。
> 環境がC#でみたいなので、\マークがエスケープされてないのではないでしょうか。
>
>>System.IO.File.Copy("\\netserver\test.txt", "C:\test.txt", True);
> ↓
> System.IO.File.Copy(@"\\netserver\test.txt", @"C:\test.txt", True);

たびたび例えが悪くてすいません。
"\\\\netserver\\test.txt"と言うような書き方をしています。
書き込むに当たって分かり難いかと思って、省略していましたが余計な混乱を与えてしまったようです。
@"\\netserver\test.txt"と記述するべきでした。
申し訳ありませんでした。
2007/03/01(Thu) 15:44:58 編集(投稿者)

> たびたび例えが悪くてすいません。
> "\\\\netserver\\test.txt"と言うような書き方をしています。
> 書き込むに当たって分かり難いかと思って、省略していましたが余計な混乱を与えてしまったようです。
> @"\\netserver\test.txt"と記述するべきでした。
> 申し訳ありませんでした。

実際のソースではどっちの表記なんですか?
本物のソースコードからのコピーを提示してください。

フォルダ名/ファイル名などはそのままは公開できない場合もあるでしょうから、
名称を適宜変更するのは仕方ないと思いますが、
例えば、hoge→fugaとかに変更するに留め、記号、空白、全角、数字、区切り記号、ディレクトリの階層の数などは
極力、本物のソースコードに順ずるようにした方がよいでしょう。

> ちゃんと\\コンピュータ名\共有名\ディレクトリ名\ファイル名という構成にしています。

先ほどのこのコメントの内容とも整合性が取れていませんよね。
共有名にあたる部分がありませんし。
できる限り、正確な情報を提供してください。
サバーってOSはWindowsでしょうか?
(Unix系で文字コード等でファイル名がアウトってこともあるので。)
> "\\\\netserver\\test.txt"と言うような書き方をしています。

それでもなお間違っています。

ネットワーク共有フォルダ(直下)にあるファイルの UNC パスは

\\ServerName\ShareFolderName\FileName

と記述します。

共有フォルダ名が抜けてるようです。
■No19219に返信(渋木宏明(ひどり)さんの記事)
>>"\\\\netserver\\test.txt"と言うような書き方をしています。
>
> それでもなお間違っています。

そして、僕の (2007/03/01(Thu) 11:05:15) の投稿に戻ると(笑)

DOBON.NET | プログラミング道 | プログラミング掲示板