2

多かれ少なかれ次のような文字列を取得します。

"C:\\bláh\\bleh"

それを使用して FileInfo を作成しますが、その存在を確認すると false が返されます。

var file = new FileInfo(path);
file.Exists;

パスの名前を手動で変更した場合

"C:\\blah\\bleh"

デバッグ時に、bleh が内部にある blah が存在することを確認すると、file.Exists が true を返し始めます。したがって、問題は非ASCII文字にあると思います。

実際の文字列は私のプログラムによって構築されます。1 つの部分はアプリケーションの AppDomain から取得されます。これは "á" を含む部分であり、もう 1 つの部分はある意味でユーザーから取得されます。両方の部分は Path.Combine によってまとめられます。結果の文字列の有効性を 2 つの方法で確認しました。パスを含む、プログラムが生成したエラーからそれをエクスプローラーにコピーすると、ファイルが正常に開きます。デバッガーでその文字列を見ると、正しくエスケープされているように見えます。\ は \ と書かれています。「á」は、デバッガーによって文字どおりに出力されます。

非ASCII文字が含まれていても有効なパスになるように、文字列を処理するにはどうすればよいですか?

4

6 に答える 6

1

ファイル名の分音記号を処理するメソッドを次に示します。File.Exists メソッドの成功は、システムがファイル名を保存する方法によって異なります。

public bool FileExists(string sPath)
{
  //Checking for composed and decomposed is to handle diacritics in filenames.  
  var pathComposed = sPath.Normalize(NormalizationForm.FormC);
  if (File.Exists(pathComposed))    
      return true;

   //We really need to check both possibilities.
   var pathDecomposed = sPath.Normalize(NormalizationForm.FormD);
   if (File.Exists(pathDecomposed))     
      return true;

   return false;
}
于 2012-09-20T15:45:11.153 に答える
0

問題は、プログラムにそのファイルにアクセスするための十分な権限がなかったことです。権限を修正すると、問題が修正されました。実験をしなかったときは、おそらくASCII以外の文字を含まないフォルダを手作業で作成し、もう一方をコピーすることで、許可の問題を再現できたようです。

ああ...とても恥ずかしい。

于 2009-08-20T09:02:35.893 に答える
0

これを試して

    string sourceFile = @"C:\bláh\bleh";
    if (File.Exists(sourceFile))
    {

         Console.WriteLine("file exist.");

    }
    else
    {
        Console.WriteLine("file does not exist.");

    }

注 : Exists メソッドは、パスの検証には使用しないでください。このメソッドは、パスで指定されたファイルが存在するかどうかを確認するだけです。Exists に無効なパスを渡すと、false が返されます。

パスの検証には、Directory.Exists を使用できます。

于 2009-08-19T07:00:05.523 に答える
0

bleh ファイルを含む bláh フォルダーを手動で作成しました。これを配置すると、このコードTrueは期待どおりに出力されます。

using System;
using System.IO;

namespace ConsoleApplication72
{
    class Program
    {
        static void Main(string[] args)
        {
            string filename = "c:\\bláh\\bleh";

            FileInfo fi = new FileInfo(filename);

            Console.WriteLine(fi.Exists);

            Console.ReadLine();
        }
    }
}

文字列のソースを確認することをお勧めします-特に、3k担当者はこれが問題であることに反対していますが、バックスラッシュ\\をC#構文のアーティファクトとして表現することを覚えておいてください。文字列に実際に単一\のsのみが含まれていることを確認してください.

于 2009-08-19T07:01:43.227 に答える
0

@adatapost の返信を参照すると、無効なファイル名文字のリスト (System.IO.Path.GetInvalidFileNameChars()実際には、分音記号付きの通常の文字は含まれていません。

あなたが本当に求めている質問は、「文字列(またはこの場合はファイル パス)から分音符号を削除するにはどうすればよいですか?」のようです。

または、この質問をしているわけではなく、次の名前のファイルを本当に見つけたいと思っているかもしれません。

c:\blòh\bleh

(または同様のもの)。その場合は、同じ名前のファイルを開こうとする必要があります c:\bloh\bleh

于 2009-08-19T07:05:52.407 に答える