Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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;
        }