예제 #1
0
        void Save(SaveHexOptionsVM hex, ref byte[] buffer)
        {
            var progress = new HexFileProgress(GetSize(hex.Document.StartOffset, hex.Document.EndOffset));

            fileProgress = progress;
            if (buffer == null)
            {
                buffer = new byte[64 * 1024];
            }

            try {
                if (File.Exists(hex.FileName))
                {
                    File.Delete(hex.FileName);
                }
                using (var stream = File.OpenWrite(hex.FileName)) {
                    ulong offs = hex.Document.StartOffset;
                    ulong end  = hex.Document.EndOffset;
                    while (offs <= end)
                    {
                        ThrowIfCanceled();

                        ulong bytesLeft    = GetSize(offs, end);
                        int   bytesToWrite = bytesLeft > (ulong)buffer.Length ? buffer.Length : (int)bytesLeft;
                        hex.Document.Read(offs, buffer, 0, bytesToWrite);
                        stream.Write(buffer, 0, bytesToWrite);
                        progress.BytesWritten += (ulong)bytesToWrite;
                        NotifyProgressUpdated();

                        ulong nextOffs = offs + (ulong)bytesToWrite;
                        if (nextOffs < offs)
                        {
                            break;
                        }
                        offs = nextOffs;
                    }
                }
            }
            catch {
                DeleteFile(hex.FileName);
                throw;
            }
        }
예제 #2
0
        void Save(SaveHexOptionsVM hex, ref byte[] buffer)
        {
            var progress = new HexFileProgress(GetSize(hex.Buffer.Span.Start, hex.Buffer.Span.End));

            fileProgress = progress;
            if (buffer == null)
            {
                buffer = new byte[64 * 1024];
            }

            try {
                if (File.Exists(hex.FileName))
                {
                    File.Delete(hex.FileName);
                }
                using (var stream = File.OpenWrite(hex.FileName)) {
                    var pos = hex.Buffer.Span.Start;
                    var end = hex.Buffer.Span.End;
                    while (pos < end)
                    {
                        ThrowIfCanceled();

                        ulong bytesLeft    = GetSize(pos, end);
                        int   bytesToWrite = bytesLeft > (ulong)buffer.Length ? buffer.Length : (int)bytesLeft;
                        hex.Buffer.ReadBytes(pos, buffer, 0, bytesToWrite);
                        stream.Write(buffer, 0, bytesToWrite);
                        progress.BytesWritten += (ulong)bytesToWrite;
                        NotifyProgressUpdated();

                        pos = pos + (ulong)bytesToWrite;
                    }
                }
            }
            catch {
                DeleteFile(hex.FileName);
                throw;
            }
        }