- PR -

UNCパス指定とネットワークドライブ指定でのファイル名チェック

1
投稿者投稿内容
toc
会議室デビュー日: 2003/10/08
投稿数: 15
投稿日時: 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パスで指定されたファイルと、ネットワークドライブを介したファイルが同一であることのチェックはどのように行えばよいのでしょうか?
また、処理方法そのものに問題があるようでしたら、そちらもご指摘していただければと思います。

以上、よろしくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-10-03 06:06
引用:

tocさんの書き込み(2006-10-02 12:06)より:
クライアントアプリにて選択されたファイルを、サーバ上の所定フォルダ(マスタ管理されていて、UNCパスで設定されています。)にコピーする処理において問題が発生しています。

クライアントアプリにてコピー先フォルダ内に存在しているファイルをネットワークドライブ経由のパス名で選択した場合、本来であればサーバへのコピーは行いたくないのですが、上書き確認&コピー処理が実行されてしまいます。

UNCパスで指定されたファイルと、ネットワークドライブを介したファイルが同一であることのチェックはどのように行えばよいのでしょうか?
また、処理方法そのものに問題があるようでしたら、そちらもご指摘していただければと思います。


状況が見えません。

 「クライアント アプリ」ということは、サーバ アプリとクライアント アプリがあることが想像されます。
また、特に「クライアント アプリにて選択されたファイル」など、「クライアント アプリにて」ということを強調されていることから、ここに書かれたプログラムは、サーバ アプリであると、判断します。

 そして、よく分からないのが、このシステムは「ウェブ アプリケーションなのだろうか」ということです。
Windows アプリっぽいのですが、まぁ、ここに書かれている処理内容は、Web でも出来ないことはないので、どちらとも判断がつきません。

 あと、「マスタ管理されていて」というのも、もしかしたら関係してくるかもしれません。データベースを使用しており、Web アプリなのであれば、「データベース上にコピーしたらいいんじゃない?」という回答が出来るかもしれません。


 このコードがサーバに書かれており、クライアントからはファイル名だけが渡されるのであれば、チェックすることは、ほぼ不可能と思います。
そのようにするためには、クライアントに、「どのドライブを、どこのネットワークに接続していますか」という問い合わせをしなければなりません。
サーバが、クライアントに対して、そのようなことを行う権限を持っていればいいのですが、
それよりも、クライアントが必ず UNC パスを引き渡すようにする方がいいでしょう。

 ネットワーク接続したドライブかどうかは、コマンド プロンプトから "NET USE" コマンドを発行すればわかりますが、WMI でも調べられると思う。

_________________
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 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 があったらいいのにねえ。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-03 10:55
引用:

未記入さんの書き込み (2006-10-03 09:53) より:

私の予想では・・・ クライアントアプリケーションのみでサーバーアプリケーションなんてものは存在しない。ここでいうサーバーとは単純にファイルサーバーである。


私もそう思います。

引用:

ネットワークドライブや UNCパスの同一性を確認するための、CanonicalPath があったらいいのにねえ。


Windows API の WNetGetConnection 関数を使って、パスを揃えて検証する方法しかなさそうですね。

# どこかの掲示板で過去に投稿したような気がします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
toc
会議室デビュー日: 2003/10/08
投稿数: 15
投稿日時: 2006-10-04 13:14
ご返答ありがとうございます。
記載内容がわかりにくく申し訳ありませんでした。

引用:


私の予想では・・・ クライアントアプリケーションのみでサーバーアプリケーションなんてものは存在しない。ここでいうサーバーとは単純にファイルサーバーである。




上記の通りの構成です。
ローカルマシンにあるファイルを選択し(ネットワーク上のファイルを選択する場合もあり)、ファイルサーバにアップする処理です。

結果的には、選択したファイルを一旦一時フォルダにコピーし、そこからファイルサーバにアップすることとなりました。(上書確認はされることになりますが)


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

スキルアップ/キャリアアップ(JOB@IT)