2

私は、HTTP、FTP、場合によってはローカルファイル(file://)の両方を介して多くの異なるコンテンツソースにアクセスする必要があるC#アプリケーションを開発しています。

さまざまなプロトコルを介してこれらのファイルにアクセスするための統一された方法が必要だったため、これを行うためにWebClientを選択しました。

MSDNに記載されているさまざまなプロトコル(FTP、HTTP、ローカルファイルなど)すべてでうまく機能しますが、問題が発生します...いくつかのリクエストが成功した後、ローカルファイルのURIを使用してファイルにアクセスできません( file:// c:\ some_dir \ somefile.ext)。

URIが正しいことをすでに確認しました。ブラウザに入力すると、ファイルが簡単に開きます。私は1つの本当に興味深いことを認識しました-それはローカルファイルに対しても最初はうまく機能します。WebClientを使用してローカルファイルのコンテンツを読み込もうとすると、最初はすべてうまく機能します。

私のプログラムは次のようになります。

  1. メインスレッド開始
  2. メインスレッドでの初期化
  3. さまざまなソースからコンテンツをダウンロードする複数のスレッド
  4. すべてのスレッドが終了するのを待ちます
  5. シングルスレッド処理のダウンロードされたもの

前に説明したように、最初のステップでWebClient.DownloadData(url)呼び出しを配置すると正常に機能しますが、3番目のステップのいずれかのスレッドで完全に同じURIにアクセスしようとすると、取得に失敗します。 「file://」で始まるURIを持つローカルファイル。

非常に単純なコードを使用して、ローカルファイルをダウンロード/取得します。

WebClient wc = new WebClient();
data = wc.DownloadData(url);

何がうまくいかないのだろうか...前の手順で、または並行スレッドでローカルファイルにアクセスできないように設定したのではないでしょうか。前の手順では、FTPサーバーからHTTPを介してコンテンツをダウンロードしますが、それが問題の原因になる可能性がありますか?メインスレッドの最初で試してみると、どのローカルファイルにも簡単にアクセスできます。FTPコンテンツにアクセスするときは、クレデンシャルも設定します。多分これは私の後の要求に影響を与えるものですか?

4

2 に答える 2

12

まあ、私は事後的にここにいますが、うまくいけば、これは誰かを助けることができます.

文字列パスではなく、Uri オブジェクトを使用することをお勧めします。ローカル ファイルの場合は、Uri コンストラクターが "file://" の部分を処理します。実際の URI は、ローカル ファイルであってもバックスラッシュよりもスラッシュを優先します。ただし、Uri オブジェクトを使用するだけであれば、そのことを心配する必要はありません。

public byte[] Load(string fileName)
{
    Uri uri = new Uri(fileName);
    var client = new WebClient();
    return client.DownloadData(uri);
}

もちろん、エラー処理などが必要ですが、基本的にはこれでうまくいきます。

File.ReadAllBytes() メソッドのみを使用する場合は、次のようにします。

public byte[] Load(string fileName)
{
    Byte[] retVal = null;
    Uri uri = new Uri(fileName);
    if(uri.Scheme == "file")
    {
        retVal = File.ReadAllBytes(uri.LocalPath);
    }
    else
    {
        var client = new WebClient();
        retVal = client.DownloadData(uri);
    }
    return retVal;
}
于 2013-05-09T17:25:53.930 に答える
0

今、私はこれを解決するための非常に簡単な解決策を持っています:

            byte[] data;
            if (url.Trim().StartsWith("file://"))
            {                    
                string fileName = url.Replace("file://","");
                data = File.ReadAllBytes(fileName);
            }
            else
            {
                WebClient wc = new WebClient();
                //wc.Proxy = GlobalProxySelection.GetEmptyWebProxy();
                data = wc.DownloadData(url);
            }
            // process data...   

これはうまく機能しますが、WebClientで何がうまくいかないのか疑問に思います...

于 2012-10-25T18:05:54.510 に答える