AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi FileExists liefert False, obwohl die Datei vorhanden ist
Thema durchsuchen
Ansicht
Themen-Optionen

FileExists liefert False, obwohl die Datei vorhanden ist

Ein Thema von DevidEspenschied · begonnen am 10. Aug 2010 · letzter Beitrag vom 10. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2      
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
439 Beiträge
 
Delphi 12 Athens
 
#1

FileExists liefert False, obwohl die Datei vorhanden ist

  Alt 10. Aug 2010, 11:54
Delphi-Version: 2007
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.
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#2

AW: FileExists liefert False, obwohl die Datei vorhanden ist

  Alt 10. Aug 2010, 11:56
Hi!

Da schlägt bestimmt die Dateisystem-Virtualisierung zu.

Schau mal, ob du unter dem Stichwort was findest.


Liebe Grüße,
Fredric
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.034 Beiträge
 
Delphi 12 Athens
 
#3

AW: FileExists liefert False, obwohl die Datei vorhanden ist

  Alt 10. Aug 2010, 11:59
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.)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

AW: FileExists liefert False, obwohl die Datei vorhanden ist

  Alt 10. Aug 2010, 12:04
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
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
439 Beiträge
 
Delphi 12 Athens
 
#5

AW: FileExists liefert False, obwohl die Datei vorhanden ist

  Alt 10. Aug 2010, 12:09
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>
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: FileExists liefert False, obwohl die Datei vorhanden ist

  Alt 10. Aug 2010, 12:10
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.443 Beiträge
 
Delphi 12 Athens
 
#7

AW: FileExists liefert False, obwohl die Datei vorhanden ist

  Alt 10. Aug 2010, 13:57
Versuch mal C:\Windows\Sysnative\WinSAT.exe
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#8

AW: FileExists liefert False, obwohl die Datei vorhanden ist

  Alt 10. Aug 2010, 14:42
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.

Geändert von jfheins (10. Aug 2010 um 14:46 Uhr)
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
439 Beiträge
 
Delphi 12 Athens
 
#9

AW: FileExists liefert False, obwohl die Datei vorhanden ist

  Alt 10. Aug 2010, 14:46
Versuch mal C:\Windows\Sysnative\WinSAT.exe
Das Verzeichnis Sysnative existiert nicht.

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?
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN

Geändert von DevidEspenschied (10. Aug 2010 um 15:00 Uhr)
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#10

AW: FileExists liefert False, obwohl die Datei vorhanden ist

  Alt 10. Aug 2010, 16:26
Ja, bei allen 64bit Windows.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 Uhr.
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