Is it possible to set the date/time of a directory in windows with Python? If so how?

Discussion in 'Python' started by ToddLMorgan, May 13, 2006.

  1. ToddLMorgan

    ToddLMorgan Guest

    I'm trying to set any of the dates (create, modification, access) of a
    directory under windows with python.

    I'm trying to do this as I'm trying to write a unittest for a directory
    cleaning script I'm writing (ie I need the test to set the create/mod
    time for some of the directories so that I can be sure that the script
    works properly - as it picks dirs based upon their age).

    I've tried using the utime( path, times). That doesn't work as the doco
    states
    "Whether a directory can be given for path depends on whether the
    operating system implements directories as files (for example, Windows
    does not)."

    So that doesn't work.

    So I tried mark hammonds win32 extensions with something like this

    import win32file, win32con, pywintypes
    filehandle = win32file.CreateFile(file,
    win32file.GENERIC_WRITE,win32file.FILE_SHARE_WRITE,
    None,win32con.OPEN_ALWAYS, 0, None)
    nowWin32=pywintypes.Time(theTime)
    win32file.SetFileTime(filehandle, nowWin32, nowWin32, nowWin32)

    which works fine for files but fails with "Access Denied" when I invoke
    the CreateFile with a directory. This seems to occur no matter the
    combination of READ or WRITE I choose for the parameters.

    So does anyone have any useful suggestions (other than not using
    windows)?

    I've thought of a couple of reallly nasty solutions:
    1. Temporarily alter the underlying system clock back to the required
    time and create the directory then resetting it back again afterwards.
    2. Create the required directory in some form of virtual filesystem -
    eg Zip file, rar archive, tar etc. Then extract it to the real
    filesystem and hope windows honors the timestamps (untested at this
    point).

    None of those is particularly appealing.

    Thanks for listening.
     
    ToddLMorgan, May 13, 2006
    #1
    1. Advertising

  2. ToddLMorgan

    Roger Upole Guest

    "ToddLMorgan" <> wrote in message news:...
    > I'm trying to set any of the dates (create, modification, access) of a
    > directory under windows with python.
    >
    > I'm trying to do this as I'm trying to write a unittest for a directory
    > cleaning script I'm writing (ie I need the test to set the create/mod
    > time for some of the directories so that I can be sure that the script
    > works properly - as it picks dirs based upon their age).
    >
    > I've tried using the utime( path, times). That doesn't work as the doco
    > states
    > "Whether a directory can be given for path depends on whether the
    > operating system implements directories as files (for example, Windows
    > does not)."
    >
    > So that doesn't work.
    >
    > So I tried mark hammonds win32 extensions with something like this
    >
    > import win32file, win32con, pywintypes
    > filehandle = win32file.CreateFile(file,
    > win32file.GENERIC_WRITE,win32file.FILE_SHARE_WRITE,
    > None,win32con.OPEN_ALWAYS, 0, None)
    > nowWin32=pywintypes.Time(theTime)
    > win32file.SetFileTime(filehandle, nowWin32, nowWin32, nowWin32)
    >
    > which works fine for files but fails with "Access Denied" when I invoke
    > the CreateFile with a directory. This seems to occur no matter the
    > combination of READ or WRITE I choose for the parameters.
    >
    > So does anyone have any useful suggestions (other than not using
    > windows)?
    >
    > I've thought of a couple of reallly nasty solutions:
    > 1. Temporarily alter the underlying system clock back to the required
    > time and create the directory then resetting it back again afterwards.
    > 2. Create the required directory in some form of virtual filesystem -
    > eg Zip file, rar archive, tar etc. Then extract it to the real
    > filesystem and hope windows honors the timestamps (untested at this
    > point).
    >
    > None of those is particularly appealing.
    >
    > Thanks for listening.


    To create a handle to a directory, you have to use
    FILE_FLAG_BACK_SEMANTICS.

    Roger
     
    Roger Upole, May 13, 2006
    #2
    1. Advertising

  3. ToddLMorgan

    ToddLMorgan Guest

    Thanks very much for that roger :)

    I changed my code to

    filehandle = win32file.CreateFile(file, win32file.GENERIC_WRITE,
    win32file.FILE_SHARE_WRITE, None, win32con.OPEN_ALWAYS,
    win32con.FILE_FLAG_BACKUP_SEMANTICS, None)
    nowWin32=pywintypes.Time(theTime)
    win32file.SetFileTime(filehandle, nowWin32, nowWin32, nowWin32)

    ie FILE_FLAG_BACKUP_SEMANTICS and everything works fine

    Just for the sake of completeness ...

    I'd just thought of another solution ... to have python determine the
    modification date for the directory based upon the oldest contained
    file (I'm guessing windows does the opposite - ie the newest file mod)
    to give me the effect of having a directory with an older date.

    The virtual file system idea didn't work either ... files had the
    correct dates but the dirs didn't as doing the extraction with python
    libs is subject to the same constraints ... and I didn't think that
    altering the ZipInfo time entries would have any affect as they appear
    to only represent files and not directories. I could have spawned a
    command line to do the extraction but I lost interest at that point.

    thanks again
     
    ToddLMorgan, May 13, 2006
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Chris Berg
    Replies:
    0
    Views:
    844
    Chris Berg
    Oct 27, 2003
  2. Peter Grison

    Date, date date date....

    Peter Grison, May 28, 2004, in forum: Java
    Replies:
    10
    Views:
    3,361
    Michael Borgwardt
    May 30, 2004
  3. Keith Cochrane
    Replies:
    2
    Views:
    646
    Keith Cochrane
    Aug 6, 2006
  4. flamesrock
    Replies:
    8
    Views:
    548
    Hendrik van Rooyen
    Nov 24, 2006
  5. Summu82
    Replies:
    5
    Views:
    898
    Richard Heathfield
    Jun 7, 2006
Loading...

Share This Page