runtime: SetCreationTime, SetLastAccessTime, SetLastWriteTime Should not open a new stream to obtain a SafeFileHandle

API Proposal

namespace System.IO
{
    public static class FileHandleExtensions
    {
        public static DateTime GetLastWriteTimeUtc(this SafeFileHandle fileHandle);
        public static void SetLastWriteTimeUtc(this SafeFileHandle fileHandle, DateTime time);
        public static DateTime GetLastAccessTimeUtc(this SafeFileHandle fileHandle);
        public static void SetLastAccessTimeUtc(this SafeFileHandle fileHandle, DateTime time);
        public static DateTime GetCreationTimeUtc(this SafeFileHandle fileHandle);
        public static void SetCreationTimeUtc(this SafeFileHandle fileHandle, DateTime time);
    }
}

Original post

I know that in many cases it is ok to do so, but we found ourself in the case where we need to set file times without closing the actual FileStream, and this is possible via Windows API. To do so we had to write unsafe code which mimic the functionality of the existing functions. (which include rewriting System.IO.__Error.WinIOError(), this is obviusly a bad thing, because we have to maintain code wich already exist) This could be extremely more usable and maintainable if the framework exposed those methods as SafeFileHandle Method/ExtensionMethod.

My proposal is to leave those functions unaltered but move the actual implementation in an ipotetic function: SafeFileHandle.SetFileTimesUtc(DateTime? creationTimeUtc, DateTime? lastAccessTimeUtc, DateTime? lastWriteTimeUtc) which should be public.

About this issue

  • Original URL
  • State: closed
  • Created 7 years ago
  • Reactions: 6
  • Comments: 25 (11 by maintainers)

Most upvoted comments

Indeed, it seems the docs are wrong.

Video

  • The scenario makes sense, but defining them as extension methods on SafeFileHandle seems odd
  • It seems more logical to define them as overloads to the string based APIs on File.
namespace System.IO
{
    public static partial class File
    {
        public static DateTime GetCreationTime(SafeFileHandle fileHandle);
        public static DateTime GetCreationTimeUtc(SafeFileHandle fileHandle);
        public static DateTime GetLastAccessTime(SafeFileHandle fileHandle);
        public static DateTime GetLastAccessTimeUtc(SafeFileHandle fileHandle);
        public static DateTime GetLastWriteTime(SafeFileHandle fileHandle);
        public static DateTime GetLastWriteTimeUtc(SafeFileHandle fileHandle);

        public static void SetCreationTime(SafeFileHandle fileHandle, DateTime creationTime);
        public static void SetCreationTimeUtc(SafeFileHandle fileHandle, DateTime creatinTimeUtc);
        public static void SetLastAccessTime(SafeFileHandle fileHandle, DateTime lastAccessTime);
        public static void SetLastAccessTimeUtc(SafeFileHandle fileHandle, DateTime lastAccessTimeUtc);
        public static void SetLastWriteTime(SafeFileHandle fileHandle, DateTime lastWriteTime);
        public static void SetLastWriteTimeUtc(SafeFileHandle fileHandle, DateTime lastWriteTimeUtc);

        // Seems we should be adding support for these too.
        // If we can't make it work, dropping is fine.
        public static FileAttributes GetAttributes(SafeFileHandle fileHandle);
        public static void SetAttributes(SafeFileHandle fileHandle, FileAttributes fileAttributes);
    }
}