/// <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(); }
/// <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); }
/// <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)); }
/// <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); }
internal IOCompletionTraceHook(IIOCompletionManager manager) { m_manager = manager; }