Skip to content

Commit

Permalink
Feat. adding ext that returns change_time for Windows
Browse files Browse the repository at this point in the history
  • Loading branch information
juliusl committed Feb 22, 2024
1 parent d9ae43c commit 610eedc
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
11 changes: 11 additions & 0 deletions library/std/src/os/windows/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,14 @@ pub trait MetadataExt {
/// `fs::metadata` or `File::metadata`, then this will return `Some`.
#[unstable(feature = "windows_by_handle", issue = "63010")]
fn file_index(&self) -> Option<u64>;


/// Returns the change time, which is the last time file metadata was changed, such as
/// renames, attributes, etc.
///
/// This will return `None` if the `Metdata` instance was not created using the FILE_BASIC_INFO type,
#[unstable(feature = "windows_change_time", issue = "121478")]
fn change_time(&self) -> Option<u64>;
}

#[stable(feature = "metadata_ext", since = "1.1.0")]
Expand Down Expand Up @@ -499,6 +507,9 @@ impl MetadataExt for Metadata {
fn file_index(&self) -> Option<u64> {
self.as_inner().file_index()
}
fn change_time(&self) -> Option<u64> {
self.as_inner().changed_u64()
}
}

/// Windows-specific extensions to [`fs::FileType`].
Expand Down
11 changes: 11 additions & 0 deletions library/std/src/sys/pal/windows/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ pub struct FileAttr {
creation_time: c::FILETIME,
last_access_time: c::FILETIME,
last_write_time: c::FILETIME,
change_time: Option<c::FILETIME>,
file_size: u64,
reparse_tag: c::DWORD,
volume_serial_number: Option<u32>,
Expand Down Expand Up @@ -375,6 +376,7 @@ impl File {
creation_time: info.ftCreationTime,
last_access_time: info.ftLastAccessTime,
last_write_time: info.ftLastWriteTime,
change_time: None, // Only available in FILE_BASIC_INFO
file_size: (info.nFileSizeLow as u64) | ((info.nFileSizeHigh as u64) << 32),
reparse_tag,
volume_serial_number: Some(info.dwVolumeSerialNumber),
Expand Down Expand Up @@ -411,6 +413,10 @@ impl File {
dwLowDateTime: info.LastWriteTime as c::DWORD,
dwHighDateTime: (info.LastWriteTime >> 32) as c::DWORD,
},
change_time: Some(c::FILETIME {
dhLowDateTime: info.ChangeTime as c::DWORD,
dhHighDateTime: (info.ChangeTime >> 32) as c::DWORD,
}),
file_size: 0,
reparse_tag: 0,
volume_serial_number: None,
Expand Down Expand Up @@ -952,6 +958,10 @@ impl FileAttr {
to_u64(&self.creation_time)
}

pub fn changed_u64(&self) -> Option<u64> {
self.change_time.as_ref().map(|c| to_u64(c))
}

pub fn volume_serial_number(&self) -> Option<u32> {
self.volume_serial_number
}
Expand All @@ -971,6 +981,7 @@ impl From<c::WIN32_FIND_DATAW> for FileAttr {
creation_time: wfd.ftCreationTime,
last_access_time: wfd.ftLastAccessTime,
last_write_time: wfd.ftLastWriteTime,
change_time: None,
file_size: ((wfd.nFileSizeHigh as u64) << 32) | (wfd.nFileSizeLow as u64),
reparse_tag: if wfd.dwFileAttributes & c::FILE_ATTRIBUTE_REPARSE_POINT != 0 {
// reserved unless this is a reparse point
Expand Down

0 comments on commit 610eedc

Please sign in to comment.