Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   OpenFile (https://www.delphipraxis.net/205681-openfile.html)

Willie1 5. Okt 2020 15:35

OpenFile
 
Hallo Leute,
ich habe mir vor 15 Jahren eine Routine gebastelt, mit der ich die drei Zeit-Stempel einer Datei verändern kann.
Delphi-Quellcode:
      if FileExists(Filename) then beep;
      HFileResult := OpenFile(pAnsiChar(filename), ofstr, OF_WRITE);
      Result:=0;
      if HFileResult <> HFILE_ERROR then begin
        if dtCreated > 0 then SetFileTime(HFileResult, @FT1, nil, nil);
        if dtModified > 0 then SetFileTime(HFileResult, nil, nil, @FT2);
        if dtLastAccess > 0 then SetFileTime(HFileResult, nil, @FT3, nil)
      end
      else begin
        Result:=GetLastError;
        if ShowErrorMsg then ShowMessage('"'+Filename+'"'#13+SysErrorMessage(Result));
      end;
Das hat immer funktioniert, jetzt geht es nicht mehr. "Das System kann die Datei nicht finden". Das ist Unsinn, die Datei ist vorhanden! Sie wird nicht von einem anderem Prozess benutzt und ist auch nicht schreibgeschützt. Dann gäbe es doch eine andere Fehlermeldung.
Der Fehler tritt seit dem Update auf Windows 10 2003 auf. Kann Zufall sein. Was ist da los?
Gruß Willie.

Der schöne Günther 5. Okt 2020 15:39

AW: OpenFile
 
Vielleicht ist der Pfad zu lang (mehr als 260 Zeichen) oder der Pfad enthält Zeichen die Delphi nicht in einen AnsiString packen kann?

PS: Vor 15 Jahren war die Welt noch eine andere. Die Doku hat vielleicht auch einen Grund wenn sie von 16-Bit-Windows spricht und sagt
Zitat:

This function has limited capabilities and is not recommended. For new application development, use the CreateFile function.

Dalai 5. Okt 2020 16:17

AW: OpenFile
 
Welche Datei versuchst du denn zu bearbeiten? Ein zu langer Pfad zu lang könnte gut sein, denn MS sagt zu MSDN-Library durchsuchenOpenFile:
Zitat:

The OFSTRUCT structure contains a path string member with a length that is limited to OFS_MAXPATHNAME characters, which is 128 characters. Because of this, you cannot use the OpenFile function to open a file with a path length that exceeds 128 characters. The CreateFile function does not have this path length limitation.
Grüße
Dalai

himitsu 5. Okt 2020 16:26

AW: OpenFile
 
Man verwendet schon seit jahrzehnten kein OpenFile mehr.
-> CreateFile hat man gefälligst zu nutzen

https://docs.microsoft.com/en-us/win...nbase-openfile



Seit ner ganzen Weile ist im Windows bei vielen "aktuelleren" APIs sogar die 255 Char-Grenze entfallen (MAX_PATH ist nicht mehr die Grenze)

Willie1 5. Okt 2020 16:29

AW: OpenFile
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1474896)
Vielleicht ist der Pfad zu lang (mehr als 260 Zeichen) oder der Pfad enthält Zeichen die Delphi nicht in einen AnsiString packen kann?

Der Pfad ist nicht zu lang, hat aber Leerzeichen keine deutschen Umlaute. Ich habe das neue Delphi seit 4 Jahren, bisher ging's.
.
Willie.

Willie1 5. Okt 2020 16:32

AW: OpenFile
 
Zitat:

Zitat von himitsu (Beitrag 1474904)
Man verwendet schon seit jahrzehnten kein OpenFile mehr.
-> CreateFile hat man gefälligst zu nutzen

https://docs.microsoft.com/en-us/win...nbase-openfile

Ok, Himitsu, das Ding ist ja auch 15 Jahre alt! W.

Willie1 5. Okt 2020 17:46

AW: OpenFile
 
Hallo,
es liegt wohl an den Leerzeichen im Pfad.

Ich habe es so umgebaut:
Delphi-Quellcode:
HFileResult := CreateFile(PChar(Filename), 0, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
Sind das so die richtigen Parameter? Da kenne ich mich nicht aus.
Willie.

himitsu 5. Okt 2020 17:51

AW: OpenFile
 
Vermutlich ja.

Kommt drauf an was du willst.
https://stackoverflow.com/questions/...of-windows-api

Wobei ich nicht weiß warum du bei einer nichtexistierenden Datei das Datum ändern willst. (inkl. dem Erstellen dieser Datei)

Willie1 5. Okt 2020 18:10

AW: OpenFile
 
Zitat:

Zitat von himitsu (Beitrag 1474912)
Vermutlich ja.

Kommt drauf an was du willst.
https://stackoverflow.com/questions/...of-windows-api

Wobei ich nicht weiß warum du bei einer nichtexistierenden Datei das Datum ändern willst. (inkl. dem Erstellen dieser Datei)

Ich habe es in OPEN_EXISTING geändert.
Natürlich will ich nur das Datum einer existierenden Datei ändern. Wie beschrieben, geht es nicht. Ich habe mich versehen, es passiert nichts. W.

Schwedenbitter 5. Okt 2020 18:26

AW: OpenFile
 
Mit
Delphi-Quellcode:
SysUtils
kann man doch folgendes basteln:
Delphi-Quellcode:
FileHandle:=FileOpen(aPath + SR.Name, fmOpenReadWrite Or fmShareExclusive);
Try
   If SetFileTime(FileHandle, @FileTime, @FileTime, @FileTime) Then
      Memo1.Lines.Append(SR.Name + ' -> success')
   Else
      Memo1.Lines.Append(SR.Name + ' -> ' + SysErrorMessage(GetLastError));
Finally
   FileClose(FileHandle);
End;
Ließ sich gerade compilieren und funktioniert.

Willie1 5. Okt 2020 18:32

AW: OpenFile
 
Muss ich mir ansehen, aber morgen!!! Willie.

Benmik 5. Okt 2020 22:05

AW: OpenFile
 
Und warum nicht einfach
Delphi-Quellcode:
TFile.SetCreationTime
?

Schwedenbitter 6. Okt 2020 06:31

AW: OpenFile
 
Zitat:

Zitat von Benmik (Beitrag 1474925)
Und warum nicht einfach
Delphi-Quellcode:
TFile.SetCreationTime
?

Spricht überhaupt nichts dagegen. Hatte bloß noch keiner in der Form geschrieben.
Letztlich nutzt das
Delphi-Quellcode:
CreateFile
. Und dass wiederum wurde schon von himitsu in's Spiel gebracht.

[edit] Einer der Vorschläge sollte zur Zufriedenheit funktionieren.[/edit]

Benmik 6. Okt 2020 11:19

AW: OpenFile
 
Es ist aber doch offensichtlich, dass Willie hier an einer API-Funktion herumdoktert, die er überhaupt nicht mehr braucht.

Willie aktualisiert ja sein 15 Jahre altes Programm. Mein Rat wäre, nicht einfach an dem 15 Jahre alten Code zu kleben und ihn dort anzupassen, wo er nicht mehr läuft. Viele Fortschritte von Delphi in dieser Zeit bestehen nicht in tollen neuen Sprachfeatures, sondern darin, dass dem Anwender das Leben leichter gemacht wird. Siehe TFile, TPath, TDirectory. Oder auch die zahlreichen Varianten von Streams, die es mittlerweile gibt. Wer verwendet noch File, Reset und Blockread? Willie sollte mal nachschauen, ob es für die 15 Jahre alten Lösungen nicht Einzeiler gibt, die alles kapseln. Man kann ja auch fallweise hier danach fragen. Es müssen ja nicht gleich anonyme Methoden oder Interfaces sein, aber z.B. Generics hat der Code wahrscheinlich nicht.

Willie1 6. Okt 2020 16:41

AW: OpenFile
 
Hallo, ihr habt recht, ich bin altmodisch. TFile.SetCreationTime kannte ich in der Tat nicht. Da muss ich noch viel lernen. Ich denke zu oft an mein altes Delphi 6.

Aber immerhin habe ich mein Problem gelöst:
Delphi-Quellcode:
HFileResult := CreateFile(PChar(Filename), FILE_WRITE_ATTRIBUTES , 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Es steht alles in der Windows-Doku, muss man sich aber zusammen suchen.
Eure Hinweise werde ich mir zu Herzen nehmen.:) Mein Programm ist nicht 15 Jahre alt, nur diese Funktion aus einer Bibliothek!
Gruß Willie.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 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