- PR -

サーバー上でのファイル存在確認

投稿者投稿内容
めい
会議室デビュー日: 2006/01/25
投稿数: 4
投稿日時: 2006-01-25 01:40
はじめまして、よろしくおねがいします。
現在C#を使って自動ダウンロードのプログラムを作っています。
サーバー上にあるファイルの存在確認をしてダウンロードするかしないか決めるのですが
ダウンロードするファイルが無ければ何もしないようにしたいのですがサーバー上にダウンロードしたいファイルがなくてもローカルにファイルができてしまいます。
ファイルの存在確認をするのにサーバー上ではFile.Exists()で存在確認ができません。
何かよい方法があれば教えてください。

これが今のダウンロードです。
WebClient wc = new WebClient() ;
wc.DownloadFile("URL", @"保存パス") ;
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-01-25 02:13
DownloadFileメソッドが使えないのならほかのものを。
例えば、WebClientクラスにはOpenReadメソッドなんてのがあります。これは対象のネットワークリソースに接続して読み取り用のStreamインスタンスを取得するメソッドです。
もしFileNotFoundやForbiddenだったページの場合、この時点で例外が投げられます。
ですからOpenReadしてからFileStreamを作る(その後取得したストリームからFileStreamに書き込む)ようにすれば、要求が失敗したときにファイルは作られなくなります。
DownloadFileほどの簡便さはありませんけどね。
めい
会議室デビュー日: 2006/01/25
投稿数: 4
投稿日時: 2006-01-26 00:44
回答ありがとうございます。
引用:

例えば、WebClientクラスにはOpenReadメソッドなんてのがあります。これは対象のネットワークリソースに接続して読み取り用のStreamインスタンスを取得するメソッドです。
もしFileNotFoundやForbiddenだったページの場合、この時点で例外が投げられます。


とありますが
WebClient wc = new WebClient() ;
try
{
 Stream st =wc.OpenRead(url);
}
catch
{
 例外処理
}
としたのですがFileNotFoundの場合でも処理が例外処理になりません
どこか間違っているのでしょうか
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-01-26 10:14
> ファイルの存在確認をするのにサーバー上ではFile.Exists()で存在確認ができません。

これができないことがそもそもおかしいです。
File.Exists()の使い方がおかしいんじゃないでしょうか?
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2006-01-26 11:19
お世話になります。

確認なのですが、サーバーとおっしゃっていらっしゃるのは
どこかの Web サーバーの事ですよね?
そこに HTTP でアクセスして、あればダウンロードしたいというお話ですよね?

引用:

めいさんの書き込み (2006-01-26 00:44) より:
としたのですがFileNotFoundの場合でも処理が例外処理になりません
どこか間違っているのでしょうか



いかのコードで、
textBox1 に http://google.co.jp/konnnanonaiyo.html
としたところ、Hongliang さんの仰るとおり、
System.Net.WebExceotion が投げられましたよ?
コード:
private void button1_Click(object sender, System.EventArgs e){
  System.Net.WebClient wc = new System.Net.WebClient();
  try{
    using(System.IO.Stream st = wc.OpenRead(this.textBox1.Text)){
      try{
        if (st.CanRead ){
          using(System.IO.StreamReader sr = new System.IO.StreamReader(st)){
            try{
              Console.WriteLine(sr.ReadToEnd());
            }finally{
              if (sr != null) sr.Close();
            }
          }
        }
      }finally{
        if (st!=null){
          st.Close();
        }
      }
    }
  }catch(System.Net.WebException we) {
    Console.WriteLine("System.Net.WebException が投げられました");
    throw we;
  }finally{
    if (wc != null) wc.Dispose();
  }
}


めい
会議室デビュー日: 2006/01/25
投稿数: 4
投稿日時: 2006-01-26 19:18
ありがとうございます。
引用:

どっとねっとふぁんさんの書き込み (2006-01-26 10:14) より:
> ファイルの存在確認をするのにサーバー上ではFile.Exists()で存在確認ができません。

これができないことがそもそもおかしいです。
File.Exists()の使い方がおかしいんじゃないでしょうか?



サーバーにあるファイルの存在確認がしたいので
File.Exists(URL);
としていました。これではいけないのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-26 19:52
引用:

めいさんの書き込み (2006-01-26 19:18) より:

サーバーにあるファイルの存在確認がしたいので
File.Exists(URL);
としていました。これではいけないのでしょうか?


サーバーで動いているからこそ、物理パスで良いです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-01-26 20:15
引用:

めいさんの書き込み (2006-01-26 19:18) より:

サーバーにあるファイルの存在確認がしたいので
File.Exists(URL);
としていました。これではいけないのでしょうか?



確認ですが、サーバ側とクライアント側の両方にアプリケーションがあるんですよね
File.Exists(URL) をやっているのはサーバ側のアプリケーションですよね

URL は Server.MapPath などでマップする必要がありますよ

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