- - PR -
UNCパス指定とネットワークドライブ指定でのファイル名チェック
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-10-02 12:06
よろしくお願いいたします。
クライアントアプリにて選択されたファイルを、サーバ上の所定フォルダ(マスタ管理されていて、UNCパスで設定されています。)にコピーする処理において問題が発生しています。 Dim src as String = クライアントアプリで選択したファイル名(フルパス or ファイル名のみ) Dim dst as String = コピー先フォルダ+選択したファイル名(ファイル名のみ) 'フルパス指定時のみコピー(再表示時はファイル名のみ表示・DBにもファイル名のみ保存) If System.IO.Path.IsPathRooted(src) Then If src.ToUpper() <> dst.ToUpper() Then 'コピー元ファイルの存在チェック(略) 'コピー先フォルダの存在チェック(略) 'コピー先ファイル名の存在チェック If System.IO.File.Exists(dst) Then '上書き確認。Noなら処理を抜ける End If Try System.IO.File.Copy(src,dst,True) Catch (ex as Exception) 'exの内容をメッセージ表示 End Try End If End If 上記のように処理しているのですが、クライアントアプリにてコピー先フォルダ内に存在しているファイルをネットワークドライブ経由のパス名で選択した場合、本来であればサーバへのコピーは行いたくないのですが、上書き確認&コピー処理が実行されてしまいます。(Syste.IO.File.Copy()で例外発生) UNCパスで指定されたファイルと、ネットワークドライブを介したファイルが同一であることのチェックはどのように行えばよいのでしょうか? また、処理方法そのものに問題があるようでしたら、そちらもご指摘していただければと思います。 以上、よろしくお願いいたします。 | ||||||||
|
投稿日時: 2006-10-03 06:06
状況が見えません。 「クライアント アプリ」ということは、サーバ アプリとクライアント アプリがあることが想像されます。 また、特に「クライアント アプリにて選択されたファイル」など、「クライアント アプリにて」ということを強調されていることから、ここに書かれたプログラムは、サーバ アプリであると、判断します。 そして、よく分からないのが、このシステムは「ウェブ アプリケーションなのだろうか」ということです。 Windows アプリっぽいのですが、まぁ、ここに書かれている処理内容は、Web でも出来ないことはないので、どちらとも判断がつきません。 あと、「マスタ管理されていて」というのも、もしかしたら関係してくるかもしれません。データベースを使用しており、Web アプリなのであれば、「データベース上にコピーしたらいいんじゃない?」という回答が出来るかもしれません。 このコードがサーバに書かれており、クライアントからはファイル名だけが渡されるのであれば、チェックすることは、ほぼ不可能と思います。 そのようにするためには、クライアントに、「どのドライブを、どこのネットワークに接続していますか」という問い合わせをしなければなりません。 サーバが、クライアントに対して、そのようなことを行う権限を持っていればいいのですが、 それよりも、クライアントが必ず UNC パスを引き渡すようにする方がいいでしょう。 ネットワーク接続したドライブかどうかは、コマンド プロンプトから "NET USE" コマンドを発行すればわかりますが、WMI でも調べられると思う。 _________________ | ||||||||
|
投稿日時: 2006-10-03 09:53
私の予想では・・・ クライアントアプリケーションのみでサーバーアプリケーションなんてものは存在しない。ここでいうサーバーとは単純にファイルサーバーである。
\\SERVER\SHARE にドライブレター N: を割り当ててネットワークドライブを構成した場合・・・ src = N:\hoge.txt (ネットワークドライブ) dst = \\SERVER\SHARE\hoge.txt (UNCパス) これらは同じファイルを指しているのだが・・・ If src.ToUpper() <> dst.ToUpper() Then の判定では異なるものとされ、コピーをおこなおうとしてしまう。 ・・・ということかな。 ネットワークドライブや UNCパスの同一性を確認するための、CanonicalPath があったらいいのにねえ。 | ||||||||
|
投稿日時: 2006-10-03 10:55
私もそう思います。
Windows API の WNetGetConnection 関数を使って、パスを揃えて検証する方法しかなさそうですね。 # どこかの掲示板で過去に投稿したような気がします。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-10-04 13:14
ご返答ありがとうございます。
記載内容がわかりにくく申し訳ありませんでした。
上記の通りの構成です。 ローカルマシンにあるファイルを選択し(ネットワーク上のファイルを選択する場合もあり)、ファイルサーバにアップする処理です。 結果的には、選択したファイルを一旦一時フォルダにコピーし、そこからファイルサーバにアップすることとなりました。(上書確認はされることになりますが) どうもありがとうございました。 |
1