Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » FILE_WRITE_ATTRIBUTES

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
29.02.2012, 04:18 Uhr
Hans
Library Walker
(Operator)



Zitat von msdn:
Changing a File Time to the Current Time
The following example sets the last-write time for a file to the current system time using the SetFileTime function.
...
The file must be opened with the CreateFile function using FILE_WRITE_ATTRIBUTES access.


Soweit, so schön. Nur wenn man dem Link folgt, dann findet man in dem Beitrag zu CreateFile nirgendwo einen Hinweis auf die FILE_WRITE_ATTRIBUTES bzw. nicht mal die Bezeichnung selbst. Oder hab ich da was falsch verstanden?

Ich hab das dort gegebene Beispiel gleich abgewandelt. Das Programm soll eine eigene Variante von Borland's TOUCH werden, womit man u.a. Datum und Urzeit von Dateien ändern kann. Der wesentliche Codeteil sieht so aus:

C++:
   WIN32_FIND_DATA ffd;
   SYSTEMTIME sysTime, MyDate;  
   FILETIME fLastWriteTime;
   HANDLE     hFile;
   HANDLE hFind = INVALID_HANDLE_VALUE;
   ...
   hFind = FindFirstFile(szDir, &ffd);
   ...
   do
   {
   ...
   hFile = CreateFile( ffd.cFileName,         // name of the file
                    GENERIC_READ | GENERIC_WRITE,   // open for reading and writing
                    0,                      // do not share
                    NULL,                   // default security
                    OPEN_EXISTING,          /* Datei öffnen wenn sie existiert */
                    FILE_ATTRIBUTE_NORMAL,  // normal file
                    NULL );                 // no attr. template
    ...
        // Change the file time
         GetFileTime( hFile, NULL, NULL, &fLastWriteTime );
         FileTimeToSystemTime( &fLastWriteTime, &sysTime);
         sysTime.wDay = MyDate.wDay;
         sysTime.wMonth = MyDate.wMonth;
         sysTime.wYear = MyDate.wYear;
         sysTime.wHour = MyDate.wHour;
         sysTime.wMinute = MyDate.wMinute;
         sysTime.wSecond = MyDate.wSecond;
         SystemTimeToFileTime( &sysTime, &fLastWriteTime);
         SetFileTime( hFile, NULL, NULL, &fLastWriteTime );
         CloseHandle( hFile );
    }
      while (FindNextFile(hFind, &ffd) != 0);


Das ganze funktioniert natürlich nicht so, wie es soll, denn im "WindoofExplodierer"... äh sorry, im WindowsExplorer haben die Dateien hinterher die selben Zeiten wie zuvor auch. Ich nehme an, dass es was mit den FILE_WRITE_ATTRIBUTES zu tun hat.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 29.02.2012 um 04:25 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.02.2012, 08:55 Uhr
~f.-th.
Gast


Hab es nur überflogen:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364399%28v=vs.85%29.aspx
Suchtest du so was?

OPEN_EXISTING, <--> CREATE_ALWAYS, ?

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.02.2012, 09:21 Uhr
TOSHMAX



Ich könnte mir vorstellen, das MyDate ein falsches Datum enthält. Andernfalls könntest du die Rückgabewerte aller Funktionen und von GetLastError() prüfen, um herauszufinden wo denn der Fehler auftritt.
Der Code scheint sonst in Ordnung zu sein.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.02.2012, 16:39 Uhr
Hans
Library Walker
(Operator)


Hi,


Zitat von ~f.-th.:
Hab es nur überflogen:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364399%28v=vs.85%29.aspx
Suchtest du so was?

danke für den Hinweis. Das werde ich mir nachher noch mal genauer vornehmen, vielleicht liegt da ja das Problem.


Zitat von TOSHMAX:
Ich könnte mir vorstellen, das MyDate ein falsches Datum enthält.

Das glaube ich nicht, weil ich das zuvor von Hand zuweise:

C++:
   WORD Tag, Monat, Jahr, Stunde, Minute, Sekunde;

   MyDate.wDay = Tag;
   MyDate.wMonth = Monat;
   MyDate.wYear = Jahr;
   MyDate.wHour = Stunde;
   MyDate.wMinute = Minute;
   MyDate.wSecond = Sekunde;


wobei ich den deutschsprachigen Variablen zuvor natürlich Werte zuweise.


Zitat von TOSHMAX:
Andernfalls könntest du die Rückgabewerte aller Funktionen und von GetLastError() prüfen, um herauszufinden wo denn der Fehler auftritt.

Ja, da werde ich wohl nicht drum herum kommen, die Fehlerprüfung auch noch mit einzubauen. Die hab ich aus den Beispielen zwar teilweise schon mit übernommen, aber ich hatte gehofft, zum Einstieg auch erst mal ohne umfangreiche Fehlerabfragen auskommen zu können... - war wohl nix.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 29.02.2012 um 16:39 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.03.2012, 10:17 Uhr
~f.-th.
Gast


Hab mir ein wenig Zeit genommen


C++:
#include <windows.h>
#include <stdio.h>
#include <io.h>
#include <string.h>

int main(void)
{
    HANDLE hFile;
    SYSTEMTIME sysTime, MyDate;
    FILETIME fLastWriteTime;

    hFile = CreateFile((LPCTSTR)"test.txt",         // name of the file
                    GENERIC_READ | GENERIC_WRITE,   // open for reading and writing
                    0,                      // do not share
                    NULL,                   // default security
                    OPEN_EXISTING,          /* Datei öffnen wenn sie existiert */
                    FILE_ATTRIBUTE_NORMAL,  // normal file
                    NULL );                 // no attr. template

        // Change the file time
         GetFileTime( hFile, NULL, NULL, &fLastWriteTime );
         FileTimeToSystemTime( &fLastWriteTime, &sysTime);
         sysTime.wDay = 9;
         sysTime.wMonth = 7;

         SystemTimeToFileTime( &sysTime, &fLastWriteTime);
         SetFileTime( hFile, NULL, NULL, &fLastWriteTime );
         CloseHandle( hFile );
}



Quelltext ist nicht optimiert.
Hier ein Beispiel, das funktionieren sollte. Hab kein aktuelles Windows zum Test.
Compiler GCC 4.6.1

Diese Infos zusätzlich, da Quelltexte, die auf Dateien zugreifen, auch betriebssystemabhängig sind.

Ist die Datei "test.txt" schreibgeschützt, sollte der Quelltext noch erweitert werden.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.03.2012, 03:02 Uhr
Hans
Library Walker
(Operator)


Hi,

@~f.-th.: Danke für das Beispiel. Ich hab das Problem mit dem Umdatieren inzwischen auch gelöst, indem ich

C++:
      // Datei oeffnen...
         hFile = CreateFile( Files[i],         // name of the file
                        GENERIC_READ | GENERIC_WRITE,   // open for reading and writing
                        FILE_SHARE_READ,        // andere dürfen auch lesen
                        NULL,                   // default security
                        OPEN_EXISTING,          /* Datei öffnen wenn sie existiert */
                        FILE_ATTRIBUTE_NORMAL,  // normal file
                        NULL );      


geschrieben habe. Der Unterschied ist, das ich mit FILE_SHARE_READ auch anderen das lesen erlaube. Ich hab zwar auch immer noch die Vermutung, das sich die zwei HANDLEs (hFile und hFind) gegenseitig blockieren, aber das konnte ich noch nicht weiter testen; habe jetzt auch erst mal anderes zu tun...

Ach ja, und das dieser Quelltext nur unter Windows funktioniert ist klar, weil er ja fast nur aus WinAPI-aufrufen besteht.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 02.03.2012 um 03:03 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.03.2012, 10:00 Uhr
~f.-th.
Gast


Ne, Windows war/ist eh klar

In der MSDN steht bei solchen Sachen öfter:
Ab Vista oder
teilweise ab XP Sp3 oder
ab ...

Beispiel:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx
ab xp oder ab 2003 Server

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.03.2012, 09:19 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


achja kleine anmerkung von mir:

FILE_GENERIC_WRITE enthält bereits FILE_WRITE_ATTRIBUTES, daher sollte dein beispiel eigentlich funktionieren.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
06.03.2012, 00:24 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von ~f.-th.:
In der MSDN steht bei solchen Sachen öfter:
Ab Vista oder teilweise ab XP Sp3 oder ab ...

Beispiel:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx
ab xp oder ab 2003 Server


ja stimmt, das ist mir auch aufgefallen. Hab noch ein altes WinAPI-Buch, das nicht von MS vertrieben wurde. Das stammt aus der Zeit, als Win95 heraus kam. Wenn man einige Funktionen, die darin beschrieben stehen, heutzutage in der MSDN nachliest, sind die angeblich auch erst ab Windows 2000 Professional verfügbar.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
06.03.2012, 09:38 Uhr
~f.-th.
Gast


Micosoft hatte damals ja nicht alles veröffentlicht was die in ihrer WinAPI genutzt hatten.
Da gab es ja in den Computer-Zeitschriften öfter die Themen: Was Microsoft nutzt, aber nicht öffentlich dokumentiert ist.
Meine auch, bei alten Büchern von Peter (?) Norton gab es ähnliche Passagen.

Die vorsichtigen Programmierer sagten dann: Ist nicht veröffentlicht, vielleicht funktioniert das das nächste mal nicht mehr.

Die forschen Programmierer: Was solls Microsoft nutzt das, warum nicht auch wir

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: