Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FileExists liefert False, obwohl die Datei vorhanden ist (https://www.delphipraxis.net/153617-fileexists-liefert-false-obwohl-die-datei-vorhanden-ist.html)

devidespe 10. Aug 2010 10:54

Delphi-Version: 2007

FileExists liefert False, obwohl die Datei vorhanden ist
 
Hallo,

ich verwende Delphi 2007 Pro auf 2 Windows 7-Installationen, einmal mit 32 und einmal mit 64 Bit. Nun muss ich prüfen, ob die Datei:

C:\Windows\system32\WinSAT.exe

vorhanden ist (dabei handelt es sich um das Systembewertungstool). Mein Programm wird mit Admin-Rechten gestartet.

Die Verwendung von FileExists liefert nun beim 32 Bit-System True, beim 64 Bit-System False. Die Datei WinSAT.exe existiert jeweils in beiden Windows-Installationen im entsprechenden Verzeichnis (das meint der Windows-Explorer und der TotalCommander).

Woran kann es liegen, dass FileExists in der 64 Bit-Windows-Installation False zurückliefert? Was kann man machen?

Danke für die Hilfe.

fkerber 10. Aug 2010 10:56

AW: FileExists liefert False, obwohl die Datei vorhanden ist
 
Hi!

Da schlägt bestimmt die Dateisystem-Virtualisierung zu.

Schau mal, ob du unter dem Stichwort was findest.


Liebe Grüße,
Fredric

himitsu 10. Aug 2010 10:59

AW: FileExists liefert False, obwohl die Datei vorhanden ist
 
In Win64 wird die Dateisystemvirtualisierung zuschlagen und dein Programm auf ein anderes Verzeichnis zuschlagen.

Prüf einfach mal mit GetFileAttributes (und eventuell noch mit FindFirstFile), ob und welchen Fehlercode (GetLastError) du zurückbekommst.

Irgendwo im Forum sollte auch schon geschrieben stehen, wie man diese Virtualisierung abschlaten kann
(mit 'nem passenden Manifest z.B.)

jfheins 10. Aug 2010 11:04

AW: FileExists liefert False, obwohl die Datei vorhanden ist
 
Da deine Anwendung immer 32 bit ist (jaja bei delphi ist das einfach ^^) läuft sie unter 64bit Systemen in der WOW64 emulation.

Guck mal in dem 64bit System, ob sich die Datei unter "C:\Windows\SysWOW64\WinSAT.exe" befindet. Wenn ja ist die Lösung einfach: Prüfe ob du dich auf einem 32 oder auf einem 64 bit System befindest. Falls 64 bittig, im syswow64 Ordner gucken statt in system32

devidespe 10. Aug 2010 11:09

AW: FileExists liefert False, obwohl die Datei vorhanden ist
 
Zitat:

Zitat von jfheins (Beitrag 1040760)
Guck mal in dem 64bit System, ob sich die Datei unter "C:\Windows\SysWOW64\WinSAT.exe" befindet. Wenn ja ist die Lösung einfach: Prüfe ob du dich auf einem 32 oder auf einem 64 bit System befindest. Falls 64 bittig, im syswow64 Ordner gucken statt in system32

Die Datei existiert leider nicht im SysWOW64-Verzeichnis, sondern nur im System32-Verzeichnis. Ich glaube, das wäre zu einfach.

Ideal wäre es, wenn man die Virtualisierung temporär für mein Programm abschalten könnte. Ich habe mein Manifest deswegen hier mal gepostet. Möglicherweise ist nur eine kleine Änderung nötig.

Delphi-Quellcode:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity
    name="ProjectName"
    processorArchitecture="*"
    version="1.0.0.0"
    type="win32"/>

<description>Windows Shell</description>

<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>


  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator" uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>

</assembly>

Bernhard Geyer 10. Aug 2010 11:10

AW: FileExists liefert False, obwohl die Datei vorhanden ist
 
Zitat:

Zitat von jfheins (Beitrag 1040760)
Da deine Anwendung immer 32 bit ist (jaja bei delphi ist das einfach ^^) läuft sie unter 64bit Systemen in der WOW64 emulation.

WOW64 ist nicht zwingend eine Emulation! Nur auf Itanium-Prozessoren läuft WOW64 als Emulation. Auf AMD's und Nicht-Itanium-64-Bit Prozessoren läuft die 32-Bit Exe im 32-Bit Modus des Prozessors.

Uwe Raabe 10. Aug 2010 12:57

AW: FileExists liefert False, obwohl die Datei vorhanden ist
 
Versuch mal C:\Windows\Sysnative\WinSAT.exe

jfheins 10. Aug 2010 13:42

AW: FileExists liefert False, obwohl die Datei vorhanden ist
 
Zitat:

Zitat von devidespe (Beitrag 1040761)
Zitat:

Zitat von jfheins (Beitrag 1040760)
Guck mal in dem 64bit System, ob sich die Datei unter "C:\Windows\SysWOW64\WinSAT.exe" befindet. Wenn ja ist die Lösung einfach: Prüfe ob du dich auf einem 32 oder auf einem 64 bit System befindest. Falls 64 bittig, im syswow64 Ordner gucken statt in system32

Die Datei existiert leider nicht im SysWOW64-Verzeichnis, sondern nur im System32-Verzeichnis. Ich glaube, das wäre zu einfach.

Hast du mit dem (64 bit) Explorer geguckt oder mit deinem (32bit) Delphiprogramm?
Hmmm ... grad geguckt, das macht doch keinen Unterschied. :?

devidespe 10. Aug 2010 13:46

AW: FileExists liefert False, obwohl die Datei vorhanden ist
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1040798)
Versuch mal C:\Windows\Sysnative\WinSAT.exe

Das Verzeichnis Sysnative existiert nicht.

Zitat:

Zitat von jfheins (Beitrag 1040808)
Hast du mit dem (64 bit) Explorer geguckt oder mit deinem (32bit) Delphiprogramm?

Ich habe den Total Commander verwendet, und der listet i.d.R. mehr auf als der Windows-Explorer. Die Suchfunktion arbeitet präziser als die indexbasierte Windowssuche.

Mittlerweile habe ich im Embarcadero-Forum (https://forums.embarcadero.com/threa...threadID=39757) eine Lösung gefunden.

Edit:
Und zwar liefert die MSDN (http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx) die passende Begründung:

32-bit applications can access the native system directory by substituting %windir%\Sysnative for %windir%\System32. WOW64 recognizes Sysnative as a special alias used to indicate that the file system should not redirect the access. This mechanism is flexible and easy to use, therefore, it is the recommended mechanism to bypass file system redirection. Note that 64-bit applications cannot use the Sysnative alias as it is a virtual directory not a real one.

Das bedeutet, dass ich unter 64 Bit-Windows-Versionen anstatt auf C:\Windows\system32\WinSAT.exe
nun auf C:\Windows\Sysnative\WinSAT.exe zugreifen muss.

Abschließend noch die Frage, ob dieses Verhalten auch bei Vista x64 zutrifft?

Dezipaitor 10. Aug 2010 15:26

AW: FileExists liefert False, obwohl die Datei vorhanden ist
 
Ja, bei allen 64bit Windows.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz