Пример #1
0
        /// <summary>
        /// Creates or opens a <see cref="IAsyncFile"/>. Throws on failure.
        /// </summary>
        /// <exception cref="BuildXL.Native.IO.NativeWin32Exception">Thrown on failure</exception>
        public static IAsyncFile CreateOrOpen(
            string path,
            FileDesiredAccess desiredAccess,
            FileShare shareMode,
            FileMode creationDisposition,
            FileFlagsAndAttributes flagsAndAttributes,
            IIOCompletionManager ioCompletionManager = null)
        {
            IAsyncFile     file;
            OpenFileResult result = TryCreateOrOpen(
                path,
                desiredAccess,
                shareMode,
                creationDisposition,
                flagsAndAttributes | FileFlagsAndAttributes.FileFlagOverlapped,
                out file,
                ioCompletionManager);

            if (file != null)
            {
                Contract.Assert(result.Succeeded);
                return(file);
            }

            Contract.Assert(!result.Succeeded);
            throw result.ThrowForError();
        }
Пример #2
0
        /// <summary>
        /// Returns an <see cref="IAsyncFile"/>. Does not throw on failure.
        /// </summary>
        private static OpenFileResult TryCreateOrOpen(
            string path,
            FileDesiredAccess desiredAccess,
            FileShare shareMode,
            FileMode creationDisposition,
            FileFlagsAndAttributes flagsAndAttributes,
            out IAsyncFile openedFile,
            IIOCompletionManager ioCompletionManager = null)
        {
            SafeFileHandle handle;
            OpenFileResult result = FileUtilities.TryCreateOrOpenFile(
                path,
                desiredAccess,
                shareMode,
                creationDisposition,
                flagsAndAttributes | FileFlagsAndAttributes.FileFlagOverlapped,
                out handle);

            if (handle != null)
            {
                Contract.Assert(result.Succeeded && !handle.IsInvalid);
                openedFile = CreateAsyncFile(handle, desiredAccess, ownsHandle: true, ioCompletionManager: ioCompletionManager, path: path);
            }
            else
            {
                Contract.Assert(!result.Succeeded);
                openedFile = null;
            }

            return(result);
        }
Пример #3
0
 /// <summary>
 /// Creates a concrete <see cref="IAsyncFile"/> instance. Throws on failure.
 /// </summary>
 /// <remarks>
 /// TODO: Currently returns a platform specific concrete instance of <see cref="IAsyncFile"/>
 /// </remarks>
 public static IAsyncFile CreateAsyncFile(
     SafeFileHandle handle,
     FileDesiredAccess access,
     bool ownsHandle,
     IIOCompletionManager ioCompletionManager = null,
     string path   = null,
     FileKind kind = FileKind.File)
 {
     return(OperatingSystemHelper.IsUnixOS
     ? (IAsyncFile) new AsyncFileUnix(handle, access, ownsHandle, path, kind)
     : (IAsyncFile) new AsyncFileWin(handle, access, ownsHandle, ioCompletionManager, path, kind));
 }
Пример #4
0
 /// <summary>
 /// Creates an <see cref="AsyncFileWin"/> to wrap an existing native handle compatible with Windows based systems.
 /// </summary>
 public AsyncFileWin(
     SafeFileHandle handle,
     FileDesiredAccess access,
     bool ownsHandle,
     IIOCompletionManager ioCompletionManager = null,
     string path   = null,
     FileKind kind = FileKind.File)
 {
     Contract.Requires(handle != null);
     Contract.Requires(!handle.IsInvalid);
     m_handle              = handle;
     m_kind                = kind;
     m_path                = path;
     m_ownsHandle          = ownsHandle;
     m_access              = access;
     m_ioCompletionManager = (IOCompletionManager)(ioCompletionManager ?? IOCompletionManager.Instance);
     m_ioCompletionManager.BindFileHandle(handle);
 }
Пример #5
0
 internal IOCompletionTraceHook(IIOCompletionManager manager)
 {
     m_manager = manager;
 }