Komisches Windows-Problem mit FileSetTime

Post a reply

Confirmation code
Enter the code exactly as it appears. All letters are case insensitive.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Komisches Windows-Problem mit FileSetTime

Re: Komisches Windows-Problem mit FileSetTime

Post by just me » 16 Jul 2016, 04:51

:offtopic:

Moin Johnny R,

zumindest ab Win Vista kann man sich das auch selbst anschauen:

Code: Select all

#NoEnv
SetBatchLines, -1

FileName := "Fully qualified file name"
For Index, Stream In EnumFileStreams(FileName)
   MsgBox, 0, Stream #%Index%, % "Size: " . Stream.Size . "`nName: " . Stream.Name

EnumFileStreams(FileName) { ; msdn.microsoft.com/en-us/library/aa364424(v=vs.85).aspx
   ; FileName : The fully qualified file name.
   Streams := []
   If (DllCall("GetVersion", "UChar") < 6) ; requires Vista+ (not sure about this)
      Return False
   VarSetCapacity(FSD, 600, 0) ; WIN32_FIND_STREAM_DATA
   HFIND := DllCall("FindFirstStreamW", "WStr", FileName, "Int", 0, "Ptr", &FSD, "UInt", 0, "Ptr")
   If (HFIND <> -1) {
      ; Uncomment to add the main stream of the file (i.e. the file itself)
      ; Streams.Insert({Size: NumGet(&FSD, 0, "UInt64"), Name: StrGet(&FSD + 8, 296, "UTF-16")})
      While DllCall("FindNextStreamW", "Ptr", HFIND, "Ptr", &FSD)
         Streams.Insert({Size: NumGet(&FSD, 0, "UInt64"), Name: StrGet(&FSD + 8, 296, "UTF-16")})
      DllCall("FindClose", "Ptr", HFIND)
      Return Streams
   }
   Return False
}
Das Editieren ist etwas problematischer. Man muss ja wissen, was drinsteht. Im Fall von :OECustomProperty (s.o.) sind das anscheinend Binärwerte, über deren Bedeutung ich nichts gefunden habe.

Re: Komisches Windows-Problem mit FileSetTime

Post by Johnny R » 15 Jul 2016, 07:39

Interessant, die Sache mit dem "Alternative Data Stream" (ADS) auf NTFS! Hier gibt es einige interessante Software dazu:
Streams von Sysinternals
AlternateStreamView von NirSoft
ADSManager von DmitryBrant
Mit einigen Editoren kann man ADS-Streams direkt editieren. Mit meinem UltraEdit32 geht es zum Beispiel (s. u.). Mit Notepad geht es nicht, es sei denn der Stream hat eine Dateiendung. Andere Tools lassen nur einen Export mit anschließendem Editieren zu.

Image

Re: Komisches Windows-Problem mit FileSetTime

Post by just me » 14 Jul 2016, 08:51

:offtopic:

Moin jNizM,

Code: Select all

#NoEnv
IniFile := A_ScriptFullPath . ":INI"
IniWrite, %IniFile%, %IniFile%, Main, Path
IniRead, Path, %IniFile%, Main, Path
MsgBox, 0, IniRead, %Path%
FileRead, Content, %IniFile%
MsgBox, 0, FileRead, %Content%
ExitApp
Funktioniert nur mit NTFS. Bei Kopieren nach FAT oder sonstigen Dateisystemen geht der INI-Teil der Datei verloren.

Änderungen der INI ändern wie bei Zvonko das Änderungsdatum der Skriptdatei. Wenn Du das verbergen willst, musst Du Dir das Änderungsdatum der Skriptdatei vor dem Schreiben holen und anschließend wieder zurücksetzen.

Du solltest vielleicht auch im alten deutschen Forum etwas dazu finden können.

Re: Komisches Windows-Problem mit FileSetTime

Post by jNizM » 14 Jul 2016, 08:32

@just me

Mehr Infos dazu (Scipt.ahk:INI) bitte =)

Re: Komisches Windows-Problem mit FileSetTime

Post by just me » 14 Jul 2016, 07:58

Hallo Zvonko,

ich weiß nicht, ob sich in der AHK-Doku Hinweise zu ADS finden, glaube es aber eher nicht. Am Anfang hat Microsoft ja versucht, das Ganze möglichst unter dem Tisch zu halten.

Soweit ich mich erinnere, war mein erster Kontakt im Zusammenhang mit AHK das 'versteckte' Einbetten von INI-Files in Skripte als Scipt.ahk:INI.

AHK kann jedenfalls damit umgehen, und das ist zumindest in diesem Fall auch gut so. ;)

Re: Komisches Windows-Problem mit FileSetTime

Post by Zvonko » 14 Jul 2016, 05:54

@just me:

GENIAL ... WIE IMMER!!!

Mit den alten Diskussionen habe ich mich auch beschäftigt, auch den Beitrag von barryd815 habe ich gelesen, der Tipp war aber für mich nicht in AHK umsetzbar. (Wo in der AHK-Dokumentation ist dieses angehängte ':' bei FileAppend erwähnt?)

Die Auswirkung deiner Lösung ist allerdings "minimal": Deine Lösung ist "nur" ca. SECHS MAL schneller als mein stümperhaftes Workaround! :clap:

Negative Auswirkungen sehe ich bisher nicht.

Re: Komisches Windows-Problem mit FileSetTime

Post by just me » 14 Jul 2016, 04:47

Moin Zvonko,

ich habe noch weiter herumgespielt und kann das Problem jetzt auch nachstellen. Hier gibt es einen Beitrag von barryd815 mit einem interessanten Hinweis, der möglicherweise in Deinem Fall als Workaround genutzt werden kann. Danach nutzen auch das mit Win Vista eingeführte Property System und/oder der Property Handler und/oder der Indexdienst ADS Streams für die Ablage bestimmter Merkmale. Die von Dir erzeugten EML-Dateien haben keinen solchen Stream. Er wird deshalb neu angelegt, wenn die Datei erstmalig im Explorer angefasst/angezeigt wird. Dadurch wird dann das Änderungsdatum der Datei aktualisiert.

Ich weiß nicht, welche Informationen dort abgelegt sind und wofür sie gebraucht werden. Es kann aber möglichertweise in Deinem Fall als Workaround genutzt werden, wenn Du der EML-Datei auch einen leeren ADS spendierst. Das Änderungsdatum wird dann vom Explorer anscheinend nicht mehr verändert:

Code: Select all

#NoEnv

Dat := 20000101010000

EmlDir := A_ScriptDir
EmlFile := "FileEml.eml"
EmlPath := EmlDir . "\" . EmlFile


FileDelete, %EmlPath%
FileAppend, , %EmlPath%
FileAppend, , %EmlPath%:OECustomProperty

; Run, Properties %EmlPath%		; WITHOUT THIS PART
; WinWait, ahk_class #32770		; OF THE SCRIPT
; Send {Esc}						; WINDOWS REVOKES
; WinWaitClose					; THE SUBSEQUENT CHANGES MADE TO THE MODIFICATION TIME OF EML FILES

FileSetTime, %Dat%, %EmlPath%, C
FileSetTime, %Dat%, %EmlPath%, A
FileSetTime, %Dat%, %EmlPath%, M


FileGetTime, TimeEml, %EmlPath%, M

MsgBox The modification time of the files has been changed to Jan 1 2000.`r`nFileGetTime confirms this:`r`nEml: %TimeEml%

MsgBox Check now (after closing this MsgBox) the properties of the file.`r`nIs the modification time of the EML file changed as desired?

Run, *Explore %EmlDir%
Ob das sonst wo negative Auswirkungen hat, musst Du ggf. selbst herausfinden.

Re: Komisches Windows-Problem mit FileSetTime

Post by nnnik » 13 Jul 2016, 05:40

Zvonko wrote:@nnnik: Heißt das, dass du mit meinem ursprünglichen Demo-Skript bei dir das Problem nicht siehst?
Nein ich habe dieses Verhalten nicht. (Win 8.1 64)

Re: Komisches Windows-Problem mit FileSetTime

Post by Zvonko » 13 Jul 2016, 05:28

@just me:
(Laut diversen früheren Diskussionen hängt das Problem mit einem PropertyHandlers-Eintrag in der Registry zusammen.)
Deine Idee führt zu einer weiteren lustigen Feststellung:
ModifyDate löst bei mir das Problem, aber NUR ZUSAMMEN MIT MSGBOX! Ohne MsgBox hilft es nicht!

EDITED: War wohl ein Fehler meinerseits. ModifyDate hilft nicht.

Re: Komisches Windows-Problem mit FileSetTime

Post by just me » 13 Jul 2016, 05:13

Moin,

ich kann das hier auch nicht nachvollziehen. Wenn es aber nur darum geht, dass sich der Explorer / die Shell vor der Änderung einmal mit der Datei beschäftigt hat, könnte das vielleicht ein Ansatz sein:

Code: Select all

#NoEnv

Dat := 20000101010000

EmlDir := A_ScriptDir
EmlFile := "FileEml.eml"
EmlPath := EmlDir . "\" . EmlFile

FileDelete, %EmlPath%
FileAppend, , %EmlPath%

; Run, Properties %FileEml%		; WITHOUT THIS PART
; WinWait, ahk_class #32770		; OF THE SCRIPT
; Send {Esc}						; WINDOWS REVOKES
; WinWaitClose					; THE SUBSEQUENT CHANGES MADE TO THE MODIFICATION TIME OF EML FILES

ModifyDate := ComObjCreate("Shell.Application").NameSpace(EmlDir).ParseName(EmlFile).ModifyDate
MsgBox, % ModifyDate ; nur zum testen

FileSetTime, %Dat%, %EmlPath%, M
FileSetTime, %Dat%, %EmlPath%, C
FileSetTime, %Dat%, %EmlPath%, A

FileGetTime, TimeEml, %EmlPath%, M


MsgBox The modification time of the files has been changed to Jan 1 2000.`r`nFileGetTime confirms this:``r`nEml: %TimeEml%

MsgBox Check now (after closing this MsgBox) the properties of the file.`r`nIs the modification time of the EML file changed as desired?

Re: Komisches Windows-Problem mit FileSetTime

Post by Zvonko » 13 Jul 2016, 05:13

@nnnik: Heißt das, dass du mit meinem ursprünglichen Demo-Skript bei dir das Problem nicht siehst?

Re: Komisches Windows-Problem mit FileSetTime

Post by nnnik » 13 Jul 2016, 05:08

Naja ich kann es nicht rekostruiren

Re: Komisches Windows-Problem mit FileSetTime

Post by Zvonko » 13 Jul 2016, 04:58

Nein, nnnik, Windows bezieht die Zeit NICHT aus den Daten der eml, das ist ja das Widersinnige, sondern es nimmt das Datum der ersten 'Registrierung', definitiv. Also reichen auch unechte eml.

Re: Komisches Windows-Problem mit FileSetTime

Post by nnnik » 13 Jul 2016, 04:56

Doch man braucht eine echte eml, da Windows die alte Zeit quasi aus den Daten der eml Datei bezieht (zumindest soweit ich es verstanden habe).
Was vermutlich auch der Grund ist warum Johnny R. es nicht nachvollziehen kann.
Bei mir funktioniert es nämlich wenn ich eine txt nehme.

Re: Komisches Windows-Problem mit FileSetTime

Post by Zvonko » 13 Jul 2016, 04:44

@Johnny R: Alles klar, danke, ein "bekanntes Windows-Problem" ist es natürlich nur im weiteren Sinne. Wegen dieses lästigen Problems auf externe Tools zurückgreifen möchte ich auch nicht, solange es brauchbare AHK-Lösungen gibt, was ja schon im Ansatz der Fall ist.

@nnnik: Tipps wären, wie gesagt, sehr willkommen. Du brauchst ja keine echte eml, nimm eine txt und benenne sie um.

Re: Komisches Windows-Problem mit FileSetTime

Post by nnnik » 13 Jul 2016, 04:41

Ich nehme an, dass es andere Möglichkeiten geben sollte, um über AHK Befehle eine Registrierung, Programiertechnisch, umzusetzten.
Vielleicht wäre es möglich über ein COM Object auf die Eigenschaften zuzugreifen (Shell.Explorer), da ich aber keine .eml Dateien hier habe kann ich dies leider nicht austesten.

Re: Komisches Windows-Problem mit FileSetTime

Post by Johnny R » 13 Jul 2016, 04:37

Du wolltest doch einen Workaround, der schneller ist, als der von Dir entdeckte Workaround. Den, denke ich, Dir mit meinem Tipp möglicherweise geboten zu haben.

Es handelt sich auch nicht unbedingt um ein "bekanntes Windows-Problem" im engeren Sinne; bei mir gibt es das Problem nämlich , wie gesagt, nicht.

Re: Komisches Windows-Problem mit FileSetTime

Post by Zvonko » 13 Jul 2016, 04:28

Nein, Johnny R, die Sache ist ein bekanntes Windows-Problem bzw. -- wie gesagt -- der Grund ist für mich hier irrelevant.

Re: Komisches Windows-Problem mit FileSetTime

Post by Johnny R » 13 Jul 2016, 04:23

Möglicherweise ist die eml-Datei durch irgendeines Deiner Programme gesperrt, d. h. "gelockt". Möglicherweise kannst Du diese Sperre mit dem Tool Unlocker aufheben, und zwar mit der Befehlszeile

Code: Select all

unlocker.exe <Datei> <Option>
vgl.: http://goo.gl/iEVBUJ
oder natürlich auch mit dem GUI dieses Tools

Re: Komisches Windows-Problem mit FileSetTime

Post by Zvonko » 13 Jul 2016, 02:32

Hallo Johnny R, danke. Die Frage, welche Windows-Komponente zu diesem unsinnigen Verhalten führt, ist für meine Zwecke allerdings irrelevant. Ich brauche eine Lösung, die unabhängig von der Windows-Situation des Anwenders funktioniert. Mit der oben beschriebenen Methode funktioniert das schon ganz gut, vielleicht ergeben sich dazu noch weitere Tipps ..

Top