Hallo zusammen,
folgendes Anliegen:
Ich habe um die 200.000 Dateien, die in verschiedenen Ordnern liegen. Diese muss ich alle sammeln und in einem Ordner ablegen. Die Pfade zu diesen Dateien habe ich aus einer Datenbank ausgelesen und liegen als Textdatei vor.
Nun lade ich diese Textdatei und will mit dem File.Copy beginnen, die Daten von A nach B zu schieben.
Problem ist, diese Dateien haben keine Erweiterung. Der File.Copy kann aber ohne der Erweiterung nichts anfangen ebenso der FileInfo.CopyTo.
Als Fehler wird mir dann "Die Datei "xxxxx" konnte nicht gefunden werden." angezeigt.
Gibt es eine Möglichkeit Dateien zu kopieren ohne eine Dateierweiterung zu haben?
MfG
Vermutlich verwendest Du File.Copy falsch; jedenfalls hat File.Copy kein Problem mit Dateien ohne Endung.
Beachte, dass es weder File noch Folder im Zielverzeichnis gibt, die genauso heissen.
Und File Copy will auch den vollständigen Pfad inkl. Dateiname.
File.Copy( @"C:\temp\testfile", @"C:\temp\codetest\testfile" );
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo Abt,
ich kann mir wirklich nicht vorstellen das ich File.Copy falsch verwende.
Ich habe es gerade eben genauso wie du beschrieben hast getestet. Weder Ordner noch Dateien existieren die so heißen.
Dann hab ich mal Testweise ein ".txt" hinter den ersten Parameter gesetzt und dann ging es?
Hast du es eben bei dir getestet?
Hallo RaVeN1703,
File.Copy verlangt meines Wissens den exakten Dateinamen inkl. Erweiterung. Platzhalter werden von File.Copy meines Wissens nicht unterstützt.
Wenn die Angaben in der Datenbank unvollständig (also ohne Erweiterung) sind, dann musst die die Erweiterung vor dem Kopieren ermitteln.
Dazu könntest du mit Directory.GetFiles ermitteln, welche Dateien in dem Quellverzeichnis vorhanden sind (die bis auf die Erweiterung mit der Angabe aus der Datenbank übereinstimmen).
Verwende die Methoden der Path-Klasse, um Pfad- und Dateinamen zu zerlegen bzw. zusammenzusetzen.
Die Benutzung der Methoden aus System.IO setzen wir als bekannt voraus. Schau in [Hinweis] Wie poste ich richtig? Punkt 1.1.1.
herbivore
Hallo herbivore,
Danke für deine Antwort.
Mit der annahme, dass die Angaben in der Datenbank unvollständig sind, hast du recht. Ich kann mir nur den vollständigen + den Dateinamen zusammenbauen lassen. Die erweiterung ist nicht enthalten.
Was ich vergessen habe zu erwähnen ist, dass die Dateien auch in den Ordnern als "Datei" hinterlegt sind. Sprich diese Dateien können nur durch unsere Software geöffnet werden, die wir in unserer Firma haben.
Leider kann ich auch nicht den ganzen Ordner kopieren, weil es vorkommen kann, dass dort eine Datei enthalten ist die ich nicht brauche.
Ist schon ein bisschen merkwürdig, dass obwohl ich die Pfade + die Dateinamen die ich brauche, habe, aber trotzdem mit diesen Infos nichts anfangen kann. Ich verzweifel... 🤔
Nein, File.Copy braucht KEINE Dateierweiterung. Und vor allem wird Dir File.Copy eine ArgumentException um die Ohren werfen, wenn Du * verwendest (Illegal characters). Das KANN nicht funktionieren.
Wenn es plötzlich mit ".txt" ging, dann hast Du keine Datei ohne Dateierweiterung, sondern ganz einfach eine Textdatei! Ansonsten würdest Du eine FileNotFoundException erhalten. Irgendwas stimmt also an Deinen Daten oder an Deinen Angaben, die Du hier schreibst, nicht.
Das Beispiel von oben ist so getestet und funktioniert - 100%tig. Zudem verwende ich selbst Dateinamen ohne Dateierweiterung und habe damit noch nie Probleme gehabt.
Der Pfad wird 1:1 an die Windows API übermittelt.
Ich habe auch an diesen Fall gedacht und alle meine Tests bzgl. FastIO haben sich so erwiesen, dass die API 100% korrekt arbeitet. Es funktioniert!
Um den Widerspruch der beiden Aussagen "File.Copy verlangt meines Wissens den exakten Dateinamen inkl. Erweiterung" und "Nein, File.Copy braucht KEINE Dateierweiterung" aufzulösen: Es muss immer der volle Dateiname angegeben werden, also der eigentliche Dateiname plus Erweiterung, falls die Datei eine Erweiterung hat. Hat die Datei keine Erweiterung, muss man natürlich auch bei File.Copy keine Erweiterung annehmen. Hat die Datei eine Erweiterung, muss man diese bei File.Copy auch angeben.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Problem ist, diese Dateien haben keine Erweiterung.
Bist Du Dir da ganz sicher ?
Lässt Du Dir die Dateierweiterungen anzeigen ?
Im Explorer unter "Ansicht" den Haken bei "Dateinamenerweiterungen" rausnehmen.
Kannst Du die Dateien mit dem Explorer kopieren ?
In der Dos-Box mit Angabe des exakten Pfades ?
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Dann hab ich mal Testweise ein ".txt" hinter den ersten Parameter gesetzt und dann ging es?
Nun ja, dann ist es ja offensichtlich, dass der Name der Datei ein ".txt" enthält. Warum sollte es dann ohne diese Angabe kopiert werden können?
Du bist nicht zufällig deshalb zu Deiner irrigen Annahme gelangt, weil der Windows-Explorer standardmäßig(*) keine Erweiterungen anzeigt?
(*) Wie man so arbeiten kann und warum das Standard ist, wird sich mir wohl nie erschließen...
Also oben hat RaVeN1703 doch beschrieben, dass die Dateien in der Datenbank ohne Erweiterung vorliegen. Auf dem Dateisystem natürlich schon (spezielle Endung der Software).
Demnach gibt es zwei Möglichkeiten:*Die von herbivore genannte, anhand des Pfades und des Dateinamen die Endung zu ermitteln *Handelt es sich bei allen Dateien alle um die gleichen Endungen aus Eurer Software, diese "hart" anfügen.
Nach beiden Fällen gilt es dann diese Endung im Quellpfad, als auch im Zielpfad anzuhängen.
Damit ist jetzt wohl (inhaltlich) alles gesagt. Auch dass das Thema unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1 fällt, wurde schon erwähnt.