Laden...

Dateien mit Zeilenumbruch im Dateinamen auflisten?

Erstellt von C#Hans vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.467 Views
C
C#Hans Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren
Dateien mit Zeilenumbruch im Dateinamen auflisten?

Hallo zusammen,

ich versuche die Ordner-und Dateistruktur auf einem eingebundenen Share auszulesen. Dummerweise erlaubt das Laufwerk (ich nehme an es liegt Linux dahinter), dass auch CrLFs in den Dateinamen vorkommen können.

Wenn ich nun die Dateien eines Ordners listen möchte in dem solch eine Datei drin ist, laufe ich auf einen Fehler. Ich liste die Files über DirectoryInfo.GetFiles().

Navigiere ich im Explorer zu dem Ordner kann ich die entsprechenden Dateien sehen. Beim Versuch solch eine Datei auf den Desktop zu kopieren kommt die Fehlermeldung, dass der Dateiname ungültig ist.

Über den Umweg der Eingabeaufforderung kann ich die Ordner inkl. der entsprechenden Dateien listen.

Hat jemand eine Idee, wie ich diese Files aus C# elegant listen kann, oder muss ich wirklich den Umweg über Prozesse und DOS-Kommandos gehen?

Danke,
Hans

T
2.219 Beiträge seit 2008
vor 5 Jahren

Wie sieht der Code aus?
Unter Linux wäre ein LF im Namen auch nicht zulässig, da es sich dabei um das Umbruchzeichen für Unix/Linux handelt.
Deshalb kann ich mir nicht vorstellen, dass du hier ein CR/LF im Dateinamen hast.

Nachtrag:
Wie sieht den die Fehlermeldung aus?
Also wie laute diese 1:1?

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

C
C#Hans Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren

Hallo,

der Code ist simpel:

            
try
{
	DirectoryInfo di = new DirectoryInfo(@"\\ufispvsdir\pr_wissen\Avid MediaFiles\MXF\UFCUTP005.1");
	FileInfo[] files = di.GetFiles("*", SearchOption.AllDirectories);
}
catch (Exception ex)
{
	System.Diagnostics.Debug.WriteLine(ex.Message);
}

Der Fehler:> Fehlermeldung:

HResult: -2147024809
Message: Illegales Zeichen im Pfad.

Und doch, es ist ein CrLf drin, auch wenn es kaum zu glauben ist. Wenn ich im Explorer bei der Datei auf umbenennen klicke und mir den Namen rauskopiere bekomme ich:
PRE_XXL_Pizza
5A37B6DBA.1.mxf

In Hex umgewandelt:
5052455F58584C5F50697A7A610D0A3541333742364442412E312E6D7866

Ich habe inzwischen mal den Ordner direkt über die Windows API (FindFirstFileW) ausgelesen und komme so an die Files ran. Ich denke, ich werde es dann einfach so machen.

LG
Hans

T
2.219 Beiträge seit 2008
vor 5 Jahren

Ich vermute mal, dass der Fehler durch .NET selbst kommt.
Hier gibt es beim normalisieren des Pfades eine Prüfung auf ungültige Zeichen.
Dabei sind CR/LF auch dabei, was dann den entsprechenden Fehler auslösen dürfte.

Link:
https://referencesource.microsoft.com/#mscorlib/system/io/path.cs,87ad0e97413def13,references
https://referencesource.microsoft.com/#mscorlib/system/io/pathinternal.cs,ca9e77dc4cfdc34d

Dabei wird aber das Default Legacy Path Handling verwendet, was diesen Fehler auslöst.
Mit dem Switch über den AppContext lässt sich das Problem ggf. lösen.

Link:
https://blogs.msdn.microsoft.com/jeremykuhne/2016/06/21/more-on-new-net-path-handling/

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

C
C#Hans Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren

Gute Idee, aber leider bleibt der Fehler, egal ob ich UseLegacyPathHandling auf True oder False stelle.

Ich denke ich bleibe einfach bei der Windows API - Variante, die nebenbei noch den Effekt hat rasend schnell zu sein.

Danke für die Unterstützung übrigens.

LG
Hans

16.806 Beiträge seit 2008
vor 5 Jahren

Ich denke ich bleibe einfach bei der Windows API - Variante, die nebenbei noch den Effekt hat rasend schnell zu sein.

.. weil der Unterschied ist, dass .NET neben dem Win32 FileHandle (hier stecken File Attributes, Name der Datei sowie Write-AccessTimes drin) noch weitere Informationen nachlädt.
So ist die .NET Implementierung bequem; hatte aber nicht den Fokus der Geschwindigkeit.