DokanError IDokanOperations.ReadFile(string fileName, byte[] buffer, out int bytesRead, long offset, DokanFileInfo info) { Log("ReadFile:{0}:{1}|lenght:[{2}]|offset:[{3}]", fileName, info.Context, buffer.Length, offset); if (info.Context == null) { //called when file is read as memory memory mapeded file usualy notepad and stuff var handle = _sftpSession.RequestOpen(GetUnixPath(fileName), Flags.Read); var data = _sftpSession.RequestRead(handle, (ulong)offset, (uint)buffer.Length); _sftpSession.RequestClose(handle); Buffer.BlockCopy(data, 0, buffer, 0, data.Length); bytesRead = data.Length; } else { // var watch = Stopwatch.StartNew(); var stream = (info.Context as SftpContext).Stream; lock (stream) { stream.Position = offset; bytesRead = stream.Read(buffer, 0, buffer.Length); } // watch.Stop(); // Log("{0}",watch.ElapsedMilliseconds); } Log("END READ:{0},{1}", offset, info.Context); return(DokanError.ErrorSuccess); }
internal SftpContextStream(SftpSession session, string path, FileMode mode, FileAccess access, SftpFileAttributes attributes) { Flags flags = Flags.None; switch (access) { case FileAccess.Read: flags = Flags.Read; break; case FileAccess.Write: flags = Flags.Write; break; case FileAccess.ReadWrite: flags = Flags.Read | Flags.Write; break; } switch (mode) { case FileMode.Append: flags |= Flags.Append; break; case FileMode.Create: if (attributes == null) { flags |= Flags.CreateNew; } else { flags |= Flags.Truncate; } break; case FileMode.CreateNew: flags |= Flags.CreateNew; break; case FileMode.Open: break; case FileMode.OpenOrCreate: flags |= Flags.CreateNewOrOpen; break; case FileMode.Truncate: flags |= Flags.Truncate; break; } _session = session; _handle = _session.RequestOpen(path, flags); _attributes = attributes ?? _session.RequestFStat(_handle); if (access.HasFlag(FileAccess.Write)) { _writeBuffer = new byte[WRITE_BUFFER_SIZE]; _writeMode = true; } _position = mode != FileMode.Append ? 0 : _attributes.Size; }