2017-03-10 5 views
0

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.

+4

'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

+4

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._ –

+0

Versuchen Sie, die Datei mit Schreibrechten zu öffnen oder nur zu lesen? –

Antwort

0

Windows verfügt über eine spezielle Handhabung für bestimmte Ordnernamen auf 64-Bit-Systemen, je nachdem, ob Sie einen 32-Bit- oder einen 64-Bit-Prozess verwenden. Beachten Sie, dass der Ordner Program Files und die Ordner System32 abhängig davon, welche Art von Prozess Sie haben, unterschiedlich zugeordnet werden.

Beachten Sie, dass dies ein Unterschied in Windows selbst ist. Es ist kein Verhalten, das nur für .NET oder Visual Basic gilt. Jede Programmplattform, die die native Windows-Dateiverarbeitung verwendet, liefert Ihnen diese Ergebnisse.

diesem Grund sollten Sie geeignete relative Pfade oder die SpecialFolders Aufzählung, sondern als feste Codierung vollständigen Pfadnamen verwenden sollten, und vorsichtig sein, wo Sie die Dinge setzen Sie später verweisen erwarten; Sie könnten feststellen, dass sie an einem anderen Ort enden, als Sie erwartet haben. Häufig sind die Ordner AppData oder ProgramData der korrektere Speicherort anstelle der Ordner Windows oder Program Files.

Verwandte Themen