2009-08-19 11 views
2

ich eine Zeichenfolge, die mehr oder weniger wie folgt aussieht:Dateipfade mit Nicht-ASCII-Zeichen und Fileinfo in C#

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

ich ein Fileinfo mit ihm machen, aber wenn ich für seine Existenz überprüfen gibt es falsch :

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

Wenn ich den Pfad zu

"C:\\blah\\bleh" 

bei Debug-Zeit und stellen Sie sicher, dass manuell umbenennen blah wit existiert h bleh drinnen, dann file.Exists fängt an, true zurück zu geben. Also glaube ich, dass das Problem der nicht-ascii Charakter ist.

Die tatsächliche Zeichenfolge wird von meinem Programm erstellt. Ein Teil kommt von der AppDomain der Anwendung, der Teil, der das "á" enthält, der andere Teil kommt in gewisser Weise vom Benutzer. Beide Teile werden von Path.Combine zusammengestellt. Ich habe die Gültigkeit der resultierenden Zeichenfolge auf zwei Arten bestätigt: Kopieren von dem Fehler, den mein Programm generiert, das den Pfad enthält, in Explorer öffnet die Datei einwandfrei. Betrachtet man diese Zeichenfolge im Debugger, sieht sie korrekt aus, da \ als \ geschrieben wird. Das "á" wird vom Debugger literarisch gedruckt.

Wie soll ich eine Zeichenkette verarbeiten, so dass sie sich selbst bei Nicht-ASCII-Zeichen als gültiger Pfad erweist?

+0

Woher kommt die Zeichenfolge? Ist es in einer Codedatei codiert oder wird es vom Benutzer bereitgestellt? –

+0

Fredrik Mörk, ich habe gerade diese Information zu der Frage selbst hinzugefügt. – Pablo

+1

Das ist ein wierd. Ich habe eine Datei mit dem gleichen Pfad und Namen erstellt, und der folgende Code gibt "True" aus: 'FileInfo fi = new FileInfo (" C: \\ bláh \\ bleh "); Console.WriteLine (fi.Exists); ' –

Antwort

0

Das Problem war: Das Programm hatte nicht genug Berechtigungen, um auf diese Datei zuzugreifen. Durch das Korrigieren der Berechtigungen wurde das Problem behoben. Es scheint, dass ich, wenn ich mein Experiment nicht gemacht habe, es irgendwie geschafft habe, das Erlaubnisproblem zu reproduzieren, möglicherweise indem ich den Ordner ohne das Nicht-ASCII-Zeichen von Hand erstellte und den anderen kopierte.

Oh ... so peinlich.

0

versuchen, diese

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

     Console.WriteLine("file exist."); 

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

    } 

Hinweis: Die Exists-Methode für die Pfadüberprüfung sollte nicht verwendet werden, ist diese Methode lediglich überprüft, ob die Datei im Pfad angegeben existiert. Das Übergeben eines ungültigen Pfades an Exists gibt false zurück.

Für die Pfadvalidierung können Sie Directory.Exists verwenden.

+0

Ich versuche nicht, den Pfad zu validieren, ich möchte sicher sein, dass die Datei tatsächlich existiert. – Pablo

0

Ich habe manuall gerade ein blah Ordner eine bleh-Datei, und mit, dass anstelle dieser Code druckt True wie erwartet enthält:

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(); 
     } 
    } 
} 

Ich würde vorschlagen, die Überprüfung der Quelle der String - insbesondere, Obwohl Ihr 3k Rep spricht, dass dies das Problem ist, denken Sie daran, dass das Ausdrücken eines Backslashs wie \\ ein Artefakt der C# -Syntax ist, und Sie sicherstellen möchten, dass Ihre Zeichenfolge tatsächlich nur einzelne \ s enthält.

+0

Die Zeichenfolge kommt von woanders und ich füge einfach mehr mit Path.Combine hinzu. Wenn ich die Zeichenfolge drucke, sieht es aus wie c: \ blah \ bleh, was ich kopieren und in das Textfeld des Dateipfads des Explorers einfügen kann und es öffnet die Datei. Und wenn ich es im Debugger anschaue, sehe ich c: \\ bláh \\ blech, also glaube ich, dass die Zeichenfolge tatsächlich korrekt ist. Später werde ich versuchen, es in einer Konsolen-App zu tun, wie Sie es getan haben und sehen, was passiert. – Pablo

0

Mit Bezug auf @ adatapost Antwort, die Liste der ungültigen Dateinamen Zeichen (von System.IO.Path.GetInvalidFileNameChars() tatsächlich gewonnenen enthält keine normalen Zeichen mit diakritischen Zeichen.

Es sieht aus wie die Frage, bist du wirklich fragen: "How do I remove diacritics from a string (oder in diesem Fall Dateipfad)“

vielleicht fragen Sie diese Frage nicht, und Sie wollen wirklich eine Datei mit dem Namen zu finden:.

c:\blòh\bleh 

(oder so ähnlich). In diesem Fall, Sie müssen dann versuchen, eine Datei mit demselben Namen zu öffnen, und nichtc:\bloh\bleh.

+0

Ich möchte an der Datei c: \ bláh \ bleh arbeiten, nicht an c: \ blah \ bleh. Ich habe mein Programm mit c: \ blah \ bleh ausprobiert, nur um zu bestätigen, dass das "á" das Problem war. Wenn ich den Pfad in irgendeiner Weise ändere, werde ich auf eine Datei zeigen, die nicht existiert, weil der Pfad korrekt ist (ich kann ihn kopieren und in den Explorer einfügen und die richtige Datei wird geöffnet). – Pablo

0

Sieht aus wie die "bleh" im Pfad ist ein Verzeichnis, keine Datei. Verwenden Sie die Directory.Exists-Methode, um zu überprüfen, ob der Ordner vorhanden ist.

+0

Nein, es ist eine Datei. – Pablo

1

Hier ist eine Methode, die Diakritika in Dateinamen behandelt. Der Erfolg der File.Exists-Methode hängt davon ab, wie das System den Dateinamen speichert.

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; 
} 
Verwandte Themen