2009-08-19 5 views
2

私は多かれ少なかれルックス、このような文字列を取得:ファイルのパスは

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

私はそれでのFileInfoを作るのが、私はその存在を確認する場合はfalseを返します:

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

私は手動でのデバッグ時に

"C:\\blah\\bleh" 

へのパスの名前を変更し、ウィットを存在何とかのことを確認した場合その中に吹き出しがあり、file.Existsがtrueを返すようになります。だから私は問題が非アスキー文字だと思う。

実際の文字列はプログラムによって作成されます。アプリケーションのAppDomainには "á"を含む部分があり、他の部分はユーザーから提供されます。両方の部分がPath.Combineによってまとめられています。私は2つの方法で結果の文字列の妥当性を確認しました。私のプログラムが生成するエラーからコピーします。パスにはエクスプローラが含まれています。デバッガでその文字列を見ると、\は\として書かれているので、正しくエスケープされたように見えます。 "á"はデバッガによって文字どおりに出力されます。

文字列を処理して、ASCII以外の文字があっても有効なパスになるようにするにはどうすればよいですか?

+0

文字列はどこから来ますか。コードファイルにコード化されているのですか、それともユーザーが提供していますか? –

+0

FredrikMörk、私はちょうど質問自体にその情報を追加しました。 – Pablo

+1

それは奇妙なものです。私は同じパスと名前を持つファイルを作成し、次のコードは '' True ''を出力します:' 'FileInfo fi = new FileInfo(" C:\\bláh\\ bleh "); Console.WriteLine(fi.Exists); ' –

答えて

0

問題は、プログラムがそのファイルにアクセスするための十分な権限を持っていないことです。権限を修正することで問題が解決されました。私が実験をしていないとき、私は何らかの形で許可問題を再現することができたと思われます。非ASCII文字のないフォルダを手動で作成し、もう一方をコピーすることによって可能性があります。

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

0

この

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

     Console.WriteLine("file exist."); 

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

    } 

注意をしてみてください:ザ・メソッドは、パスの検証に使用してはならない存在するパスで指定したファイルが存在する場合、このメソッドは単にチェックします。無効なパスをExistsに渡すとfalseが返されます。

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

+0

パスを検証しようとしていないため、ファイルが実際に存在していることを確認したい。 – Pablo

0

私はちょうどmanuallが所定の位置に、そしてそれとblehファイルを含む何とかフォルダを作成して、このコードの予想通りプリント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#構文の成果物であり、文字列には実際には\という文字列しか含まれていないことを確認してください。 @ adatapostの返信を参照

+0

文字列は他の場所から来ています。私はPath.Combineを使って文字列を追加します。文字列を印刷すると、c:\bláh\ blehのようになります。これをコピーしてエクスプローラのファイルパステキストボックスに貼り付け、ファイルを開きます。そして私がデバッガでそれを見ると、私はc:\\bláh\\ blehを見るので、文字列が実際に正しいと信じています。後で私はあなたのようにコンソールアプリケーションでそれをやろうとし、何が起こるかを見ます。 – Pablo

0

は、実際にはSystem.IO.Path.GetInvalidFileNameChars()から収集無効なファイル名の文字のリストは、(発音区別符号と通常の文字が含まれていません。

それはあなたが本当に求めている質問のように見える、 "How do I remove diacritics from a stringを(または、この場合は、ファイルパス)「

それとも、この質問をされていない、とあなたは本当に名前のファイル探したい:?。

c:\blòh\bleh 

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

+0

私はc:\ blah \ blehではなくc:\bláh\ blehというファイルで作業したいと思っています。私は "á"が問題であることを確認するために、私のプログラムをc:\ blah \ blehで試してみました。パスを変更すると、存在しないファイルを指し示すことになります。パスが正しいからです(エクスプローラでコピー&ペーストして正しいファイルが開かれます)。 – Pablo

0

パスの "bleh"のように見えるのは、ファイルではなくディレクトリです。フォルダが存在するかどうかを確認するには、Directory.Existsメソッドを使用します。

+0

いいえ、ファイルです。 – Pablo

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; 
} 
関連する問題