Exemple #1
0
        private static void WithReadableStream(string path, Func <AsyncFileStream, Task> action)
        {
#if NET_FRAMEWORK
            using (var io = new IOCompletionManager())
#else
            IIOCompletionManager io = null;
#endif
            {
                using (
                    IAsyncFile file = AsyncFileFactory.CreateOrOpen(
                        path,
                        FileDesiredAccess.GenericRead,
                        FileShare.Read | FileShare.Delete,
                        FileMode.Open,
                        FileFlagsAndAttributes.None,
                        io))
                {
                    using (AsyncFileStream stream = file.CreateReadableStream())
                    {
                        XAssert.IsTrue(stream.CanRead);
                        XAssert.IsTrue(stream.CanSeek);
                        XAssert.IsFalse(stream.CanWrite);

                        action(stream).GetAwaiter().GetResult();
                    }
                }
            }
        }
Exemple #2
0
        public async Task ReadEmptyFile()
        {
            string path = GetFullPath("file");

            using (File.Create(path))
            {
            }

#if NET_FRAMEWORK
            using (var io = new IOCompletionManager())
#else
            IIOCompletionManager io = null;
#endif
            {
                using (
                    IAsyncFile file = AsyncFileFactory.CreateOrOpen(
                        path,
                        FileDesiredAccess.GenericRead,
                        FileShare.Read | FileShare.Delete,
                        FileMode.Open,
                        FileFlagsAndAttributes.None,
                        io))
                {
                    XAssert.IsTrue(file.CanRead);
                    XAssert.IsFalse(file.CanWrite);

                    var buffer = new byte[10];
                    FileAsyncIOResult result = await file.ReadAsync(buffer, buffer.Length, 0);

                    XAssert.AreEqual(FileAsyncIOStatus.Failed, result.Status);
                    XAssert.IsTrue(result.ErrorIndicatesEndOfFile);

                    result = await file.ReadAsync(buffer, buffer.Length, 16);

                    XAssert.AreEqual(FileAsyncIOStatus.Failed, result.Status);
                    XAssert.IsTrue(result.ErrorIndicatesEndOfFile);
                }
            }
        }
Exemple #3
0
        public async Task ReadFileRandomAccess()
        {
            const int NumberOfReads        = 16;
            const int NumberOfWordsPerRead = 64 * 1024;
            const int NumberOfBytesPerRead = NumberOfWordsPerRead * 4;
            const int NumberOfWords        = NumberOfWordsPerRead * NumberOfReads;
            const int TotalSize            = NumberOfWords * 4;

            string path = GetFullPath("file");

            using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Delete))
            {
                using (var writer = new BinaryWriter(fs, Encoding.UTF8, leaveOpen: true))
                {
                    for (int i = 0; i < NumberOfWords; i++)
                    {
                        writer.Write((int)i);
                    }
                }
            }

#if NET_FRAMEWORK
            using (var io = new IOCompletionManager())
#else
            IIOCompletionManager io = null;
#endif
            {
                using (
                    IAsyncFile file = AsyncFileFactory.CreateOrOpen(
                        path,
                        FileDesiredAccess.GenericRead,
                        FileShare.Read | FileShare.Delete,
                        FileMode.Open,
                        FileFlagsAndAttributes.None,
                        io))
                {
                    XAssert.IsTrue(file.CanRead);
                    XAssert.IsFalse(file.CanWrite);

                    var readBuffer = new byte[TotalSize];
                    var readTasks  = new Task[NumberOfReads];
                    for (int i = 0; i < readTasks.Length; i++)
                    {
                        int offset = NumberOfBytesPerRead * i;
                        readTasks[i] = Task.Run(
                            async() =>
                        {
                            byte[] localBuffer = new byte[NumberOfBytesPerRead];
                            int readSoFar      = 0;
                            while (readSoFar < NumberOfBytesPerRead)
                            {
                                FileAsyncIOResult result =
                                    await file.ReadAsync(localBuffer, bytesToRead: NumberOfBytesPerRead - readSoFar, fileOffset: offset + readSoFar);
                                XAssert.AreEqual(FileAsyncIOStatus.Succeeded, result.Status);
                                XAssert.IsTrue(result.BytesTransferred > 0);
                                XAssert.IsTrue(readSoFar + result.BytesTransferred <= NumberOfBytesPerRead);

                                Buffer.BlockCopy(localBuffer, 0, readBuffer, offset + readSoFar, result.BytesTransferred);
                                readSoFar += result.BytesTransferred;
                            }

                            Contract.Assert(readSoFar == NumberOfBytesPerRead);
                        });
                    }

                    for (int i = 0; i < readTasks.Length; i++)
                    {
                        await readTasks[i];
                    }

                    using (var reader = new BinaryReader(new MemoryStream(readBuffer, writable: false), Encoding.UTF8, leaveOpen: false))
                    {
                        for (int i = 0; i < NumberOfWords; i++)
                        {
                            XAssert.AreEqual(i, reader.ReadInt32());
                        }
                    }
                }
            }
        }