Announcement

Collapse
No announcement yet.

"Erstellt:"-Datum von Ordnern ändern...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • "Erstellt:"-Datum von Ordnern ändern...

    Hey,

    Ich habe folgendes Problem: Ich möchte das Datum, an dem ein Verzeichnis erstellt wurde ändern, nun liefert mir aber CreateFile immer "InvalidHandle". Was mache ich falsch?

    <pre>
    if (CreateFile('C:\test',
    GENERIC_READ + GENERIC_WRITE,
    FILE_SHARE_READ,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_DIRECTORY+FILE_FLAG_BACKUP_SEMANTIC S,
    0) = INVALID_HANDLE_VALUE) then
    ShowMessage('Invalid handle');
    </pre>

    (SetFileTime benötigt leider immer ein Handle)

    Tim

  • #2
    Ich weiss zwar nicht ob du ueberhaupt CreateFile auf die Directory darfst, aber versuche es doch mal ohne (!) GENERIC_READ + GENERIC_WRITE, also 0. Genaugenommen willst du die Directory ja garnicht lesen oder schreiben

    Comment


    • #3
      Moin Tim,<br>
      <br>
      erst einmal vorweg:<br>
      Ich würde Flags nicht mit + sondern mit or verknüpfen.<br>
      Da die tatsächlichen Werte auch als negativ interpretiert werden könnten, könnte es sonst bei Addition der Werte zu unerwünschten Ergebnissen kommen.<br>
      <br>
      Aber nun mal zum eigentlichen Problem:<br>
      Ich hab' Dein Beispiel mal so wie es ist übernommen (nur mit c:\temp), und es hat, erwartungsgemäss, einwandfrei funktioniert. Allerdings nur beim ersten Aufruf.<br>
      Der Fehler besteht darin, dass das über CreateFile angeforderte Handle verworfen wird, und somit nicht wieder freigegeben werden kann.<br>
      Probier's mal so:<br>
      <pre>
      var
      hDirectory : DWORD;

      begin
      hDirectory := CreateFile('C:\temp',
      GENERIC_READ or GENERIC_WRITE,
      FILE_SHARE_READ,
      nil,
      OPEN_EXISTING,
      FILE_ATTRIBUTE_DIRECTORY or FILE_FLAG_BACKUP_SEMANTICS,
      0);
      try
      if hDirectory = INVALID_HANDLE_VALUE then
      begin
      ShowMessage('Invalid handle');
      end;
      finally
      CloseHandle(hDirectory);
      end;
      end;
      </pre>
      Das kannst Du beliebig oft hintereinander aufrufen, und die "Invalid Handle" Meldung kommt nur, wenn das Verzeichnis nicht existiert.<br>
      <br>
      @Robert:<br>
      Doch, man kann mit CreateFile ein Directory ansprechen. Das ist sogar ausdrücklich im PSDK dokumentiert.<br>
      In der Beschreibung zu FILE_FLAG_BACKUP_SEMANTICS steht, u.a.:<br>
      "You can also set this flag to obtain a handle to a directory. A directory handle can be passed to some functions in place of a file handle."<br>
      <br>
      Ciao<br>
      Chri

      Comment


      • #4
        Hallo nochmal,

        ich schätze das Problem liegt am Betriebssystem (Win9x). Denn in der MSDN steht folgendes:
        <pre>
        FILE_FLAG_BACKUP_SEMANTICS:<br><br>
        Windows <b>NT</b>: Indicates that the file is being opened or created for a backup or restore operation. The system ensures that the calling process overrides file security checks, provided it has the necessary privileges. The relevant privileges are SE_BACKUP_NAME and SE_RESTORE_NAME.<br>
        You can also set this flag to obtain a handle to a directory. A directory handle can be passed to some Win32 functions in place of a file handle.
        </pre>

        Kann es sein, dass das Ganze nur unter NT möglich ist?

        Ti

        Comment


        • #5
          Moin Tim,<br>
          <br>
          ersetz doch mal den Text in ShowMessage durch<br>
          <br>
          SysErrorMessage(GetLastError)<br>
          <br>
          Dann gibt's vielleicht eine genauere Beschreibung was denn nun nicht funktioniert hat.<br>
          Ausserdem wird im PSDK zu Directories noch geschrieben, dass man sie nur mit GENERIC_READ öffnen sollte.<br>
          Ich würd' dann einfach mal das GENERIC_WRITE und das FILE_FLAG_BACKUP_SEMANTICS weglassen.<br>
          <br>
          Ciao<br>
          Chri

          Comment


          • #6
            Hey Christian,

            auch nach Weglassen von GENERIC_WRITE und FILE_FLAG_BACKUP_SEMANTICS, kommt als SysErrorMsg: "Zugriff wurde verweigert"...

            Ti

            Comment


            • #7
              ...hat es jemand schonmal unter Win9x ausprobiert

              Comment


              • #8
                Moin Tim,<br>
                <br>
                ich hab's gerade mal unter 98 ausprobiert.<br>
                Mit und ohne GENERIC_WRITE, mit und ohne FILE_FLAG_BACKUP_SEMANTICS, mit und ohne FILE_ATTRIBUTE_DIRECTORY.<br>
                Insgesamt 6 Varianten, keine hat funktioniert. Seltsam.<br>
                Bleibt wohl nur noch mal ein wenig mit dem FILE_SHARE Flag zu probieren.<br>
                <br>
                Ciao<br>
                Chri

                Comment


                • #9
                  Hey Christian,

                  das wundert mich ein bisschen, da es wirklich angeblich unter Windows 98 laufen soll (andere Tester). Bei mir hat's bis jetzt noch nie geklappt?!

                  Ti

                  Comment


                  • #10
                    Moin Tim,<br>
                    <br>
                    und mit welchem Aufruf genau hat's unter 98 funktioniert?<br>
                    <br>
                    Wenn ich mich nicht irre, hatte ich CreateFile auch mal dazu "missbraucht" ein "DirectoryExists" zu schreiben, und soweit ich weiss lief das auch unter 98 (bei Testern ;-))<br>
                    Deshalb schrieb ich auch "seltsam".<br>
                    <br>
                    Ciao<br>
                    Chri

                    Comment


                    • #11
                      Hey,

                      folgendes habe ich dazu gefunden:

                      <pre>
                      Wie kann ich das Datum einer Datei oder eines Ordners ändern?
                      In folgender Prozedur wird dargestellt, wie das Erstellungsdatum eines Ordners geändert.
                      Statt eines Ordners kann hier auch ein Dateinamen angegeben werden.
                      <br><br>
                      procedure ChangeCreateDate(path: string);
                      var fOk : Boolean;
                      hFile : THandle;
                      ftCreationUTC : TFileTime;
                      ftLastAccessUTC : TFileTime;
                      ftLastWriteUTC : TFileTime;
                      ftCreationLocal : TFileTime;
                      ftLastAccessLocal: TFileTime;
                      ftLastWriteLocal : TFileTime;
                      stCreationLocal : TSystemTime;
                      stLastAccessLocal: TSystemTime;
                      stLastWriteLocal : TSystemTime;
                      dtCreationLocal : TDateTime;
                      dtLastAccessLocal: TDateTime;
                      dtLastWriteLocal : TDateTime;
                      begin
                      fOK := false;<br><br>

                      hFile := CreateFile(path,
                      GENERIC_READ or GENERIC_WRITE,
                      FILE_SHARE_READ, nil,
                      OPEN_EXISTING,
                      FILE_FLAG_BACKUP_SEMANTICS {wichtig (für NT!)} or
                      FILE_ATTRIBUTE_DIRECTORY, 0);
                      <br><br>
                      if (hFile INVALID_HANDLE_VALUE) then
                      try
                      if GetFileTime(hFile, @ftCreationUTC, @ftLastAccessUTC, @ftLastWriteUTC) then begin
                      if FileTimeToLocalFileTime(ftCreationUTC, ftCreationLocal)
                      and FileTimeToLocalFileTime(ftLastAccessUTC, ftLastAccessLocal)
                      and FileTimeToLocalFileTime(ftLastWriteUTC, ftLastWriteLocal) then begin
                      if FileTimeToSystemTime(ftCreationLocal, stCreationLocal)
                      and FileTimeToSystemTime(ftLastAccessLocal, stLastAccessLocal)
                      and FileTimeToSystemTime(ftLastWriteLocal, stLastWriteLocal) then begin
                      dtCreationLocal := SystemTimeToDateTime(stCreationLocal);
                      dtLastAccessLocal := SystemTimeToDateTime(stLastAccessLocal);
                      dtLastWriteLocal := SystemTimeToDateTime(stLastWriteLocal);
                      ShowMessage('Erzeugt: ' + DateTimeToStr(dtCreationLocal) + #13#10 +
                      'Zugriff: ' + DateTimeToStr(dtLastAccessLocal) + #13#10 +
                      'Geändert: ' + DateTimeToStr(dtLastWriteLocal));
                      // Ich setze einfach die CreationTime auf Jetzt (now)
                      DateTimeToSystemTime(Now, stCreationLocal);
                      if SystemTimeToFileTime(stCreationLocal, ftCreationLocal) then begin
                      if LocalFileTimeToFileTime(ftCreationLocal, ftCreationUTC) then begin
                      // Wir wollen die anderen Zeiten nicht setzen -> nil
                      fOK := SetFileTime(hFile, @ftCreationUTC, nil, nil);
                      end;
                      end;
                      end;
                      end;
                      end;
                      finally
                      CloseHandle(hFile);
                      end;
                      if not fOK then ShowMessage(SysErrorMessage(GetLastError));
                      end;
                      <br><br>
                      Beitrag von Martin Strohal
                      (mailto:[email protected]
                      http://www.tipps.delphi-source.de/dateien/tut20000801-1.shtml)
                      </pre>

                      Ti

                      Comment


                      • #12
                        Moin Tim,<br>
                        <br>
                        jetzt erzähl aber nicht, dass das bei Dir funktioniert.<br>
                        der Aufruf von CreateFile entspricht immerhin exakt Deinem aus dem Eingangsposting.<br>
                        <br>
                        Ciao<br>
                        Chri

                        Comment


                        • #13
                          Nö, ich hab' ja auch nicht gesagt, dass es bei mir selbst klappt, wenn's ginge wäre ich froh und würde nicht dauernd fragen ;-)

                          Wie macht das Windows eigentlich (hardwaremäßig meine ich - irgendwie in einen Sektor schreiben)?

                          Gibt es Altrenativen?

                          Ti

                          Comment

                          Working...
                          X