Beispiel #1
0
        public static void Wipe(Func <IDataSource> sourceFactory, FileStream destination, IProgress <int> progress, CancellationToken cancelToken)
        {
            progress.Report(0);
            destination.Seek(0, SeekOrigin.Begin);

            var diskSize   = IoctlQueryer.GetDiskLength(destination.SafeFileHandle);
            var sectorSize = GetHighestPowerOf2(diskSize, max: 1024 * 1024);

            var buffer = new byte[sectorSize];

            using (var source = sourceFactory())
            {
                for (long i = 0; i < diskSize; i += sectorSize)
                {
                    cancelToken.ThrowIfCancellationRequested();

                    source.GetBytes(buffer);
                    destination.Write(buffer, 0, buffer.Length);
                    progress.Report(GetPercentage(i, diskSize));
                }
            }
        }