Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Dateien mit Zeilenumbruch im Dateinamen auflisten?
C#Hans
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

Dateien mit Zeilenumbruch im Dateinamen auflisten?

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1767
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am .
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.
private Nachricht | Beiträge des Benutzers
C#Hans
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

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:
Fehler
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
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1767
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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,referenceshttps://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.
private Nachricht | Beiträge des Benutzers
C#Hans
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15510
Herkunft: BW

beantworten | zitieren | melden

Zitat von C#Hans
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.
private Nachricht | Beiträge des Benutzers