Darabonba/File.cs (143 lines of code) (raw):

using System; using System.IO; using System.Threading.Tasks; namespace Darabonba { public class File : IDisposable { public readonly string _path; public FileInfo _fileInfo; public FileStream _fileStream; public long _position; public File(string path) { _path = path; _fileInfo = new FileInfo(path); _position = 0; _fileStream = new FileStream(_path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); } public void Dispose() { if (_fileStream != null) { _fileStream.Dispose(); } } public string Path() { return _path; } private void EnsureFileInfoLoaded() { if (!_fileInfo.Exists) { _fileInfo = new FileInfo(_path); } } public Date CreateTime() { EnsureFileInfoLoaded(); return new Date(_fileInfo.CreationTimeUtc); } public async Task<Date> CreateTimeAsync() { return await Task.Run(() => { EnsureFileInfoLoaded(); return new Date(_fileInfo.CreationTimeUtc); }); } public Date ModifyTime() { EnsureFileInfoLoaded(); return new Date(_fileInfo.LastWriteTimeUtc); } public async Task<Date> ModifyTimeAsync() { EnsureFileInfoLoaded(); return new Date(_fileInfo.LastWriteTimeUtc); } public int Length() { EnsureFileInfoLoaded(); return (int)_fileInfo.Length; } public async Task<int> LengthAsync() { EnsureFileInfoLoaded(); return (int)_fileInfo.Length; } public byte[] Read(int size) { _fileStream.Seek(_position, SeekOrigin.Begin); byte[] buffer = new byte[size]; int bytesRead = _fileStream.Read(buffer, 0, size); if (bytesRead == 0) { return null; } _position += bytesRead; return buffer; } public async Task<byte[]> ReadAsync(int size) { _fileStream.Seek(_position, SeekOrigin.Begin); byte[] buffer = new byte[size]; int bytesRead = await _fileStream.ReadAsync(buffer, 0, size); if (bytesRead == 0) { return null; } _position += bytesRead; return buffer; } public void Write(byte[] data) { _fileStream.Seek(0, SeekOrigin.End); _fileStream.Write(data, 0, data.Length); _fileStream.Flush(); _fileInfo.Refresh(); } public async Task WriteAsync(byte[] data) { _fileStream.Seek(0, SeekOrigin.End); await _fileStream.WriteAsync(data, 0, data.Length); await _fileStream.FlushAsync(); _fileInfo.Refresh(); } public void Close() { if (_fileStream != null) { _fileStream.Flush(); _fileStream.Close(); _fileStream = null; } } public async Task CloseAsync() { if (_fileStream != null) { await _fileStream.FlushAsync(); _fileStream.Close(); _fileStream = null; } } public static bool Exists(string path) { return System.IO.File.Exists(path); } public static async Task<bool> ExistsAsync(string path) { return System.IO.File.Exists(path); } public static FileStream CreateReadStream(string path) { return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None); } public static FileStream CreateWriteStream(string path) { return new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.None); } } }