Ich arbeite an einer Anwendung in VB.Net gebaut, die ein Dokument ermöglicht, hochgeladen und in einer Datenbank gespeichert werden. Ich habe diese Anwendung nicht erstellt, aber ich halte sie aufrecht und setze hier und da Verbesserungen ein. Das Zielframework ist .Net4Ist Datei.Open Verzeichnis Verhalten anders in x86 vs x64
Eine der Funktionen in diesem Prozess beim Hochladen und Speichern des Dokuments verwendet die Methode File.Open(), um auf die Datei zuzugreifen und andere Methoden zum Komprimieren auszuführen. Die Methode, die File.Open verwendet, übernimmt einen Parameter, der nur den Dateinamen und nicht den vollständigen Pfad des Ursprungs angibt.
Wenn diese Anwendung auf eine x64 Maschine läuft ich einen Fehler (System.IO.FileNotFoundException) erhalten, wenn der Code die File.Open Methode trifft beschweren, dass es nicht die Datei zu öffnen finden. Es wird erwartet, dass sich die Datei in dem Programm befindet, das das Verzeichnis ausführt, was sinnvoll ist, da es nur den Dateinamen erhält, von dem es ausgehen soll, und nicht das gesamte Verzeichnis, aus dem es stammt.
Was mir kommt, ist, dass diese exakt dieselbe Anwendung (genau die gleichen gebauten Baugruppen) gut läuft, wenn sie auf einem x86 System ausgeführt wird. Es scheitert nicht an File.Open() Es übergibt nur noch den Dateinamen, aber irgendwie wird es die Verzeichnisinformationen kennen.
Wie ist das möglich?
Es ist erwähnenswert, dass die Methode, die die File.Open() - Methode enthält, sich in einem anderen Projekt in derselben Lösung befindet. Es ist eine referenzierte DLL. z.B. MyApp.exe (Windows Form Application) verweist auf MyUtil.dll (Klassenbibliothek). Ich habe gegen x86, x64 und AnyCPU Konfigurationen gebaut.
Ich verstehe, dass die Lösung wäre, nur das gesamte Verzeichnis an die Methode zu übergeben, aber was ich wissen muss ist, wie das überhaupt möglich ist? Ich möchte besser verstehen, warum das passieren würde, und hoffentlich würde dies jemand anderem helfen, besser zu verstehen, wie sich Assemblies in verschiedenen Systemumgebungen unterscheiden können.
EDIT: Mit einem absoluten Pfad wurde das zugrunde liegende Problem behoben. Weitere Informationen zu diesem Szenario finden Sie in den Kommentaren unten.
'Es wird erwartet, dass die Datei in den ausführenden Programmen des Programms ist, das ist ein Fehler. Windows hat lange Verzeichnisse für Daten wie 'Benutzer' und' Programmdaten' und andere für ausführbare Dateien und noch andere für Windows-Systemdateien bereitgestellt. – Plutonix
Machen Sie eine DuckDuckGo Suche nach Windows File System Virtualization. Es gibt viele Treffer. Unter ihnen ist [dieser] (https: // www.symantec.com/connect/articles/folder-virtualization-concepts-windows-vista) (zufällig ausgewählt). Über diesen Link: Wenn beispielsweise eine Legacy-Anwendung versucht, in das Programmverzeichnis zu schreiben, leitet UAC diese Operation automatisch in einen ungeschützten benutzerspezifischen Ordner um._ –
Versuchen Sie, die Datei mit Schreibrechten zu öffnen oder nur zu lesen? –