Exemplo n.º 1
0
        public void OpenWrite_WithLargeFile_InParallel_PassesContextCorrectly()
        {
            var fixture = DokanOperationsFixture.Instance;

            var path    = fixture.FileName.AsRootedPath();
            var context = new object();

#if LOGONLY
            fixture.SetupAny();
#else
            fixture.ExpectCreateFile(path, WriteAccess, WriteShare, FileMode.OpenOrCreate, FileOptions.None,
                                     context: context);
            fixture.ExpectWriteFileInChunks(path, largeData, FILE_BUFFER_SIZE, context: context);

            fixture.PermitProbeFile(path, largeData);
#endif

            var sut = new FileInfo(fixture.FileName.AsDriveBasedPath());

            using (var stream = sut.OpenWrite())
            {
                var totalWrittenBytes = 0;

                Parallel.For(0, DokanOperationsFixture.NumberOfChunks(FILE_BUFFER_SIZE, largeData.Length), i =>
                {
                    var origin = i * FILE_BUFFER_SIZE;
                    var count  = Math.Min(FILE_BUFFER_SIZE, largeData.Length - origin);
                    lock (stream)
                    {
                        stream.Seek(origin, SeekOrigin.Begin);
                        stream.Write(largeData, origin, count);
                        totalWrittenBytes += count;
                    }
                });
            }

#if !LOGONLY
            fixture.VerifyContextWriteInvocations(path, 6);
#endif
        }
Exemplo n.º 2
0
        public void OpenRead_WithLargeFile_InParallel_PassesContextCorrectly()
        {
            var fixture = DokanOperationsFixture.Instance;

            var path    = fixture.FileName.AsRootedPath();
            var context = new object();

#if LOGONLY
            fixture.SetupAny();
#else
            fixture.ExpectCreateFile(path, ReadAccess, ReadOnlyShare, FileMode.Open, FileOptions.None, context: context);
            fixture.ExpectReadFileInChunks(path, largeData, FILE_BUFFER_SIZE, context: context);
#endif

            var sut = new FileInfo(fixture.FileName.AsDriveBasedPath());

            using (var stream = sut.OpenRead())
            {
                var target         = new byte[largeData.Length];
                var totalReadBytes = 0;

                Parallel.For(0, DokanOperationsFixture.NumberOfChunks(FILE_BUFFER_SIZE, largeData.Length), i =>
                {
                    var origin = i * FILE_BUFFER_SIZE;
                    var count  = Math.Min(FILE_BUFFER_SIZE, target.Length - origin);
                    lock (stream)
                    {
                        stream.Seek(origin, SeekOrigin.Begin);
                        totalReadBytes += stream.Read(target, origin, count);
                    }
                });
            }

#if !LOGONLY
            fixture.VerifyContextReadInvocations(path, 6);
#endif
        }