Пример #1
0
 public PboFSFolder(string name) : base()
 {
     Children        = new Dictionary <string, PboFSNode>();
     FileInformation = new DokanNet.FileInformation()
     {
         Attributes     = System.IO.FileAttributes.Directory,
         FileName       = name,
         LastAccessTime = DateTime.Now,
         LastWriteTime  = DateTime.Now,
         CreationTime   = DateTime.Now,
     };
 }
Пример #2
0
 public PboFSFile(string name, PboArchive archive, FileEntry file) : base()
 {
     Archive         = archive;
     File            = file;
     FileInformation = new DokanNet.FileInformation()
     {
         Attributes     = System.IO.FileAttributes.Normal,
         FileName       = name,
         Length         = (long)file.DataSize,
         LastAccessTime = DateTime.Now,
         LastWriteTime  = DateTime.Now,
         CreationTime   = DateTime.Now,
     };
 }
Пример #3
0
        public PboFsRealFile(System.IO.FileInfo inputFile, PboFsFolder inputParent) : base()
        {
            file   = inputFile;
            parent = inputParent;

            FileInformation = new DokanNet.FileInformation()
            {
                Attributes     = file.Attributes,
                FileName       = file.Name,
                Length         = file.Length,
                LastAccessTime = file.LastAccessTime,
                LastWriteTime  = file.LastWriteTime,
                CreationTime   = file.CreationTime,
            };
        }
Пример #4
0
        public PboFsFile(string name, FileEntry file, PboFsFolder inputParent) : base()
        {
            File = file;
            var fileTimestamp = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime().AddSeconds(file.TimeStamp);

            parent          = inputParent;
            FileInformation = new DokanNet.FileInformation()
            {
                Attributes     = System.IO.FileAttributes.Normal | FileAttributes.ReadOnly,
                FileName       = name,
                Length         = (long)file.DataSize,
                LastAccessTime = DateTime.Now,
                LastWriteTime  = fileTimestamp,
                CreationTime   = fileTimestamp,
            };
        }
Пример #5
0
        public NtStatus GetFileInformation(string fileName, out FileInformation fileInfo, DokanFileInfo info)
        {
            DiscUtils.DiscFileSystemInfo finfo;

            if (this.isoReader.DirectoryExists(fileName))
                finfo = this.isoReader.GetDirectoryInfo(fileName);
            else if (this.isoReader.FileExists(fileName))
                finfo = this.isoReader.GetFileInfo(fileName);
            else
            {
                fileInfo = new FileInformation();
                return DokanResult.FileNotFound;
            }

            fileInfo = new FileInformation
            {
                FileName = fileName,
                Attributes = finfo.Attributes,
                CreationTime = finfo.CreationTime,
                LastAccessTime = finfo.LastAccessTime,
                LastWriteTime = finfo.LastAccessTime,
                Length = (finfo is DiscUtils.DiscDirectoryInfo) ? 0 : ((DiscUtils.DiscFileInfo)finfo).Length,
            };

            return DokanResult.Success;
        }
Пример #6
0
 public NtStatus FindFilesWithPattern(string fileName, string searchPattern, out IList<FileInformation> files, DokanFileInfo info)
 {
     files = new FileInformation[0];
     return DokanResult.NotImplemented;
 }
        private static void Addto(FILL_FIND_STREAM_DATA fill, DokanFileInfo rawFileInfo, FileInformation fi)
        {
            Debug.Assert(!String.IsNullOrEmpty(fi.FileName));
            var data = new WIN32_FIND_STREAM_DATA
            {
                StreamSize = fi.Length,
                cStreamName = fi.FileName
            };
            //ZeroMemory(&data, sizeof(WIN32_FIND_DATAW));

            fill(ref data, rawFileInfo);
        }
Пример #8
0
        DokanError IDokanOperations.FindFiles(string fileName, out IList<FileInformation> files, DokanFileInfo info)
        {
            //Log("FindFiles:{0}", fileName);
            LogFSActionInit("FindFiles", fileName, (SftpContext)info.Context, "");

            /*
            var dircache = _cache.Get(fileName) as Tuple<DateTime, IList<FileInformation>>;
            if (dircache != null)
            {
                files = (dircache).Item2;
                Log("CacheHit:{0}", fileName);
                return DokanError.ErrorSuccess;
            }*/

            byte[] handle;
            try
            {
                handle = _sftpSession.RequestOpenDir(GetUnixPath(fileName));
            }
            catch (SftpPermissionDeniedException)
            {
                files = null;
                return DokanError.ErrorAccessDenied;
            }

            files = new List<FileInformation>();
            for (var sftpFiles = _sftpSession.RequestReadDir(handle);
                 sftpFiles != null;
                 sftpFiles = _sftpSession.RequestReadDir(handle))
            {

                (files as List<FileInformation>).AddRange(sftpFiles.Select(
                    file =>
                        {
                            var sftpFileAttributes = file.Value;
                            if (sftpFileAttributes.IsSymbolicLink)
                            {
                                sftpFileAttributes = _sftpSession.RequestStat(
                                    GetUnixPath(String.Format("{0}\\{1}", fileName, file.Key)), true) ??
                                                     file.Value;
                            }

                            var fileInformation = new FileInformation
                                                      {
                                                          Attributes =
                                                              FileAttributes.NotContentIndexed,
                                                          CreationTime
                                                              =
                                                              sftpFileAttributes
                                                              .
                                                              LastWriteTime,
                                                          FileName
                                                              =
                                                              file.Key
                                                          ,
                                                          LastAccessTime
                                                              =
                                                              sftpFileAttributes
                                                              .
                                                              LastAccessTime,
                                                          LastWriteTime
                                                              =
                                                              sftpFileAttributes
                                                              .
                                                              LastWriteTime,
                                                          Length
                                                              =
                                                              sftpFileAttributes
                                                              .
                                                              Size
                                                      };
                            if (sftpFileAttributes.IsSymbolicLink)
                            {
                                //fileInformation.Attributes |= FileAttributes.ReparsePoint;
                                //link?
                            }

                            if (sftpFileAttributes.IsSocket)
                            {
                                fileInformation.Attributes
                                    |=
                                    FileAttributes.NoScrubData | FileAttributes.System | FileAttributes.Device;
                            }else if (sftpFileAttributes.IsDirectory)
                            {
                                fileInformation.Attributes
                                    |=
                                    FileAttributes.
                                        Directory;
                                fileInformation.Length = 4096;//test
                            }
                            else
                            {
                                fileInformation.Attributes |= FileAttributes.Normal;
                            }

                            if (file.Key[0] == '.')
                            {
                                fileInformation.Attributes
                                    |=
                                    FileAttributes.
                                        Hidden;
                            }

                            if (GroupRightsSameAsOwner(sftpFileAttributes))
                            {
                                fileInformation.Attributes |= FileAttributes.Archive;
                            }
                            if (!this.UserCanWrite(sftpFileAttributes))
                            {
                                fileInformation.Attributes |= FileAttributes.ReadOnly;
                            }
                            if (_useOfflineAttribute)
                            {
                                fileInformation.Attributes
                                    |=
                                    FileAttributes.
                                        Offline;
                            }
                            return fileInformation;
                        }));

               int timeout = Math.Max(_attributeCacheTimeout + 2, _attributeCacheTimeout +  sftpFiles.Length / 10);

               foreach (
                    var file in
                        sftpFiles.Where(
                            pair => !pair.Value.IsSymbolicLink))
                {
                    /*_cache.Set(GetUnixPath(String.Format("{0}{1}", fileName, file.Key)), file.Value,
                               DateTimeOffset.UtcNow.AddSeconds(timeout));*/
                   CacheAddAttr(GetUnixPath(String.Format("{0}\\{1}", fileName , file.Key)), file.Value,
                                DateTimeOffset.UtcNow.AddSeconds(timeout));
                }
            }

            _sftpSession.RequestClose(handle);

            try
            {
                CacheAddDir( GetUnixPath(fileName), new Tuple<DateTime, IList<FileInformation>>(
                                         (info.Context as SftpContext).Attributes.LastWriteTime,
                                         files),
                           DateTimeOffset.UtcNow.AddSeconds(Math.Max(_attributeCacheTimeout,
                                                                     Math.Min(files.Count, _directoryCacheTimeout))));
            }
            catch
            {
            }
            LogFSActionSuccess("FindFiles", fileName, (SftpContext)info.Context, "Count:{0}", files.Count);
            return DokanError.ErrorSuccess;
        }
Пример #9
0
        public DokanError FindFiles(
            string filename,
            out IList<FileInformation> files,
            DokanFileInfo info)
        {
            Debug("FindFiles {0}", filename);

            files = new List<FileInformation>();
            try
            {
                string path = GetPath(filename);
                ArrayList entries = (ArrayList)GetChannel().ls(path);

                foreach (ChannelSftp.LsEntry entry in entries)
                {

                    FileInformation fi = new FileInformation();

                    fi.Attributes = entry.getAttrs().isDir() ?
                        FileAttributes.Directory :
                        FileAttributes.Normal;

                    if (DokanSSHFS.UseOffline)
                        fi.Attributes |= FileAttributes.Offline;

                    DateTime org = new DateTime(1970, 1, 1, 0, 0, 0, 0);

                    fi.CreationTime = org.AddSeconds(entry.getAttrs().getMTime());
                    fi.LastAccessTime = org.AddSeconds(entry.getAttrs().getATime());
                    fi.LastWriteTime = org.AddSeconds(entry.getAttrs().getMTime());
                    fi.Length = entry.getAttrs().getSize();
                    //fi.FileName = System.Text.Encoding.UTF8.GetString(entry.getFilename().getBytes());
                    fi.FileName = entry.getFilename();

                    if (fi.FileName.StartsWith("."))
                    {
                        fi.Attributes |= FileAttributes.Hidden;
                    }
                    files.Add(fi);
                }
                return DokanError.ErrorSuccess;

            }
            catch (SftpException)
            {
                return DokanError.ErrorError;
            }
            catch (Exception e)
            {
                connectionError_ = true;
                Debug(e.ToString());
                Reconnect();
                return DokanError.ErrorError;
            }
        }
Пример #10
0
        DokanError IDokanOperations.FindFiles(string fileName, out IList<FileInformation> files, DokanFileInfo info)
        {
            SftpDrive drive = this.GetDriveByMountPoint(fileName, out fileName);
            LogFSActionError("FindFiles", fileName, drive, "!? not using FindFilesWithPattern !?");

            if (drive != null)
                return GetSubSystemOperations(drive).FindFiles(fileName, out files, info);

            //this shoud be never called

            files = new List<FileInformation>();

            string path = fileName.Substring(1);//cut leading \
            foreach(SftpDrive subdrive in _subsytems)
            {
                string mp = subdrive.MountPoint; //  mp1 || mp1\mp2 ...

                if (path.Length > 0) //not root dir
                {
                    if (path == mp) //this shoud not happend, because is managed by drive
                    {
                        Log("Error, mountpoint not in drives?");
                        break;
                    }

                    if (mp.IndexOf(path + '\\') == 0) //path is part of mount point =>implies=> length of path>mp
                    {
                        mp = mp.Substring(path.Length + 1); //cut the path
                    }
                    else
                    {
                        continue;
                    }
                }

                int cuttmp = mp.IndexOf('\\');
                if (cuttmp>0) // have submountpoint like  mp1\mp2
                {
                    mp = mp.Substring(0, cuttmp);
                }

                if (!files.Select(file => file.FileName).Contains(mp))
                {
                    FileInformation fi = new FileInformation();
                    fi.FileName = mp;
                    fi.Attributes = FileAttributes.NotContentIndexed | FileAttributes.Directory | FileAttributes.Offline | FileAttributes.System;
                    fi.CreationTime = DateTime.Now;
                    fi.LastWriteTime = DateTime.Now;
                    fi.LastAccessTime = DateTime.Now;
                    files.Add(fi);
                }
            }

            return DokanError.ErrorSuccess;
        }
Пример #11
0
        public NtStatus GetFileInformation(string fileName, out FileInformation fileInfo, DokanFileInfo info)
        {
            fileInfo = new FileInformation();
            fileInfo.FileName = fileName;
            fileInfo.Attributes = fileName == "\\" ? FileAttributes.Directory : FileAttributes.Normal;
            fileInfo.Length = 0;
            Console.Error.WriteLine("Attempted to get info for {0}", fileName);

            return NtStatus.Success;
        }
Пример #12
0
        public NtStatus GetFileInformation(
            string filename,
            out FileInformation fileinfo,
            DokanFileInfo info)
        {
            fileinfo = new FileInformation {FileName = filename};

            if (filename == "\\")
            {
                fileinfo.Attributes = FileAttributes.Directory;
                fileinfo.LastAccessTime = DateTime.Now;
                fileinfo.LastWriteTime = null;
                fileinfo.CreationTime = null;

                return DokanResult.Success;
            }

            var key = GetRegistoryEntry(filename);
            if (key == null)
                return DokanResult.Error;

            fileinfo.Attributes = FileAttributes.Directory;
            fileinfo.LastAccessTime = DateTime.Now;
            fileinfo.LastWriteTime = null;
            fileinfo.CreationTime = null;

            return DokanResult.Success;
        }
Пример #13
0
 public NtStatus FindFiles(
     string filename,
     out IList<FileInformation> files,
     DokanFileInfo info)
 {
     files = new List<FileInformation>();
     if (filename == "\\")
     {
         foreach (var name in TopDirectory.Keys)
         {
             var finfo = new FileInformation
             {
                 FileName = name,
                 Attributes = FileAttributes.Directory,
                 LastAccessTime = DateTime.Now,
                 LastWriteTime = null,
                 CreationTime = null
             };
             files.Add(finfo);
         }
         return DokanResult.Success;
     }
     else
     {
         var key = GetRegistoryEntry(filename);
         if (key == null)
             return DokanResult.Error;
         foreach (var name in key.GetSubKeyNames())
         {
             var finfo = new FileInformation
             {
                 FileName = name,
                 Attributes = FileAttributes.Directory,
                 LastAccessTime = DateTime.Now,
                 LastWriteTime = null,
                 CreationTime = null
             };
             files.Add(finfo);
         }
         foreach (var name in key.GetValueNames())
         {
             var finfo = new FileInformation
             {
                 FileName = name,
                 Attributes = FileAttributes.Normal,
                 LastAccessTime = DateTime.Now,
                 LastWriteTime = null,
                 CreationTime = null
             };
             files.Add(finfo);
         }
         return DokanResult.Success;
     }
 }
Пример #14
0
        DokanError IDokanOperations.GetFileInformation(string fileName, out FileInformation fileInfo,
            DokanFileInfo info)
        {
            SftpDrive drive = this.GetDriveByMountPoint(fileName, out fileName);
            LogFSActionInit("FileInfo", fileName, drive, "");
            if (drive != null)
            {
                LogFSActionSuccess("FileInfo", fileName, drive, "NonVFS");
                return GetSubSystemOperations(drive).GetFileInformation(fileName, out fileInfo, info);
            }

            fileInfo = new FileInformation
            {
                Attributes =
                    FileAttributes.NotContentIndexed | FileAttributes.Directory | FileAttributes.Offline | FileAttributes.System,
                FileName = Path.GetFileName(fileName), //String.Empty,
                // GetInfo info doesn't use it maybe for sorting .
                CreationTime = DateTime.Now,
                LastAccessTime = DateTime.Now,
                LastWriteTime = DateTime.Now,
                Length = 4096
            };

            if (fileName.Length == 1)
            { //root dir
                LogFSActionSuccess("FileInfo", fileName, drive, "root info");
                return DokanError.ErrorSuccess;
            }

            string path = fileName.Substring(1);//cut leading \

            if (info.Context != null)
            {
                drive = info.Context as SftpDrive;
                LogFSActionSuccess("FileInfo", fileName, drive, "from context");
                return DokanError.ErrorSuccess;
            }

            foreach (SftpDrive subdrive in _subsytems)
            {
                string mp = subdrive.MountPoint; //  mp1 || mp1\mp2 ...
                if (path == mp)
                {
                    info.Context = mp;
                    //fileInfo.FileName = path.Substring(path.LastIndexOf("\\")+1);
                    LogFSActionSuccess("FileInfo", fileName, drive, "final mountpoint");
                    return DokanError.ErrorSuccess;
                }

                if (mp.IndexOf(path + '\\') == 0)
                { //path is part of mount point
                    //fileInfo.FileName = path.Substring(path.LastIndexOf("\\") + 1);
                    LogFSActionSuccess("FileInfo", fileName, drive, "part of mountpoint");
                    return DokanError.ErrorSuccess;
                }
            }

            LogFSActionError("FileInfo", fileName, drive, "path not found");
            return DokanError.ErrorPathNotFound;
        }
Пример #15
0
        DokanError IDokanOperations.FindFilesWithPattern(string fileName,string pattern, out IList<FileInformation> files, DokanFileInfo info)
        {
            SftpDrive drive = this.GetDriveByMountPoint(fileName, out fileName);
            LogFSActionInit("FindFilesPat", fileName, drive, "");

            if (drive != null)
            {
                LogFSActionSuccess("FindFilesPat", fileName, drive, "NonVFS");
                return GetSubSystemOperations(drive).FindFilesWithPattern(fileName, pattern, out files, info);
            }

            files = new List<FileInformation>();

            string path = fileName.Substring(1);//cut leading \
            foreach (SftpDrive subdrive in _subsytems)
            {
                string mp = subdrive.MountPoint; //  mp1 || mp1\mp2 ...
                if (mp.Length == 0)
                    continue;

                if (path.Length > 0) //not root dir
                {
                    if (path == mp) //this shoud not happend, because is managed by drive
                    {
                        LogFSActionError("FindFilesPat", fileName, drive, "mountpoint not in drives?");
                        break;
                    }

                    if (mp.IndexOf(path + '\\') == 0) //path is part of mount point =>implies=> length of path>mp
                    {
                        mp = mp.Substring(path.Length + 1); //cut the path
                    }
                    else
                    {
                        continue;
                    }
                }

                int cuttmp = mp.IndexOf('\\');
                if (cuttmp > 0) // have submountpoint like  mp1\mp2
                {
                    mp = mp.Substring(0, cuttmp);
                }

                if (!files.Select(file => file.FileName).Contains(mp))
                {
                    FileInformation fi = new FileInformation();
                    fi.FileName = mp;
                    fi.Attributes = FileAttributes.NotContentIndexed | FileAttributes.Directory | FileAttributes.Offline | FileAttributes.System;
                    fi.CreationTime = DateTime.Now;
                    fi.LastWriteTime = DateTime.Now;
                    fi.LastAccessTime = DateTime.Now;
                    files.Add(fi);
                }
            }

            //apply pattern
            List<FileInformation> filteredfiles = new List<FileInformation>();
            Regex repattern = new Regex("^" + Regex.Escape(pattern).Replace("\\*", ".*") + "$");
            foreach (FileInformation fi in files)
            {
                if (repattern.IsMatch(fi.FileName))
                {
                    filteredfiles.Add(fi);
                    LogFSActionOther("FindFilesPat", fileName, drive, "Result:{0}", fi.FileName);
                }
            }
            files = filteredfiles;

            LogFSActionError("FindFilesPat", fileName, drive, "Pattern:{0} Count:{1}", pattern, files.Count);
            return DokanError.ErrorSuccess;
        }
Пример #16
0
 public DokanError FindFiles(
     string filename,
     out IList<FileInformation> files,
     DokanFileInfo info)
 {
     files = new List<FileInformation>();
     if (filename == "\\")
     {
         foreach (string name in TopDirectory.Keys)
         {
             FileInformation finfo = new FileInformation();
             finfo.FileName = name;
             finfo.Attributes = System.IO.FileAttributes.Directory;
             finfo.LastAccessTime = DateTime.Now;
             finfo.LastWriteTime = DateTime.Now;
             finfo.CreationTime = DateTime.Now;
             files.Add(finfo);
         }
         return DokanError.ErrorSuccess;
     }
     else
     {
         RegistryKey key = GetRegistoryEntry(filename);
         if (key == null)
             return DokanError.ErrorError;
         foreach (string name in key.GetSubKeyNames())
         {
             FileInformation finfo = new FileInformation();
             finfo.FileName = name;
             finfo.Attributes = System.IO.FileAttributes.Directory;
             finfo.LastAccessTime = DateTime.Now;
             finfo.LastWriteTime = DateTime.Now;
             finfo.CreationTime = DateTime.Now;
             files.Add(finfo);
         }
         foreach (string name in key.GetValueNames())
         {
             FileInformation finfo = new FileInformation();
             finfo.FileName = name;
             finfo.Attributes = System.IO.FileAttributes.Normal;
             finfo.LastAccessTime = DateTime.Now;
             finfo.LastWriteTime = DateTime.Now;
             finfo.CreationTime = DateTime.Now;
             files.Add(finfo);
         }
         return DokanError.ErrorSuccess;
     }
 }
Пример #17
0
        public NtStatus GetFileInformation(string fileName, out FileInformation fileInfo, DokanFileInfo info)
        {
            // may be called with info.Context == null, but usually it isn't
            string path = GetPath(fileName);
            FileSystemInfo finfo = new FileInfo(path);
            if (!finfo.Exists)
                finfo = new DirectoryInfo(path);

            fileInfo = new FileInformation
            {
                FileName = fileName,
                Attributes = finfo.Attributes,
                CreationTime = finfo.CreationTime,
                LastAccessTime = finfo.LastAccessTime,
                LastWriteTime = finfo.LastWriteTime,
                Length = (finfo is FileInfo) ? ((FileInfo)finfo).Length : 0,
            };
            return Trace("GetFileInformation", fileName, info, DokanResult.Success);
        }
Пример #18
0
        public DokanError GetFileInformation(string filename, out FileInformation fileinfo, DokanFileInfo info)
        {
            CacheEntry entry = cache_.Lookup(filename);

            DokanError ret = 0;

            if (entry.GetFileInfoRet == DokanError.Undefined)
            {
                ret = ope_.GetFileInformation(filename, out fileinfo, info);
                entry.GetFileInfoRet = ret;
                entry.GetFileInfoValue = fileinfo;
            }
            else
            {
                FileInformation finfo = entry.GetFileInfoValue;

                fileinfo = new FileInformation();
                fileinfo.Attributes = finfo.Attributes;
                fileinfo.CreationTime = finfo.CreationTime;
                fileinfo.FileName = finfo.FileName;
                fileinfo.LastAccessTime = finfo.LastAccessTime;
                fileinfo.LastWriteTime = finfo.LastWriteTime;
                fileinfo.Length = finfo.Length;

                ret = entry.GetFileInfoRet;
            }

            return ret;
        }
Пример #19
0
        public DokanError GetFileInformation(
            string filename,
            out FileInformation fileinfo,
            DokanFileInfo info)
        {
            fileinfo = new FileInformation();
            try
            {
                string path = GetPath(filename);
                SftpATTRS attr = GetChannel().stat(path);

                fileinfo.Attributes = attr.isDir() ?
                    FileAttributes.Directory :
                    FileAttributes.Normal;

                if (DokanSSHFS.UseOffline)
                    fileinfo.Attributes |= FileAttributes.Offline;

                DateTime org = new DateTime(1970, 1, 1, 0, 0, 0, 0);

                fileinfo.CreationTime = org.AddSeconds(attr.getMTime());
                fileinfo.LastAccessTime = org.AddSeconds(attr.getATime());
                fileinfo.LastWriteTime = org.AddSeconds(attr.getMTime());
                fileinfo.Length = attr.getSize();

                return DokanError.ErrorSuccess;
            }
            catch (SftpException)
            {
                return DokanError.ErrorError;
            }
            catch (Exception e)
            {
                connectionError_ = true;
                Debug(e.ToString());
                Reconnect();
                return DokanError.ErrorError;
            }
        }
Пример #20
0
 public void RemoveGetFileInfoCache()
 {
     GetFileInfoRet = DokanError.Undefined;
     GetFileInfoValue = new FileInformation();
 }
 NtStatus IDokanOperations.GetFileInformation(string fileName, out FileInformation fileInfo, DokanFileInfo info)
 {
     return Operations.GetFileInformation(fileName, out fileInfo, info);
 }
Пример #22
0
 public NtStatus GetFileInformation(string fileName, out DokanNet.FileInformation fileInfo, DokanFileInfo info)
 {
     return(implementation.GetFileInformation(fileName, out fileInfo, new PassthruDFI(info)));
 }
Пример #23
0
        DokanError IDokanOperations.GetFileInformation(string fileName, out FileInformation fileInfo,
            DokanFileInfo info)
        {
            //Log("GetInfo:{0}:{1}", fileName,info.Context);
            LogFSActionInit("FileInfo", fileName, (SftpContext)info.Context, "");

            var context = info.Context as SftpContext;

            SftpFileAttributes sftpFileAttributes;
            string path = GetUnixPath(fileName);

            if (context != null)
            {
                /*
                 * Attributtes in streams are causing trouble with git. GetInfo returns wrong length if other context is writing.
                 */
                //sftpFileAttributes = context.Attributes;
                //test:
                if (context.Stream != null)
                    sftpFileAttributes = GetAttributes(path);
                else
                    sftpFileAttributes = context.Attributes;
            }
            else
            {

                //sftpFileAttributes = _cache.Get(path) as SftpFileAttributes;
                sftpFileAttributes = CacheGetAttr(path);

                if (sftpFileAttributes == null)
                {
                    sftpFileAttributes = GetAttributes(path);
                    if (sftpFileAttributes != null)
                        //_cache.Add(path, sftpFileAttributes, DateTimeOffset.UtcNow.AddSeconds(_attributeCacheTimeout));
                        CacheAddAttr(path, sftpFileAttributes, DateTimeOffset.UtcNow.AddSeconds(_attributeCacheTimeout));
                }
            }
            if (sftpFileAttributes == null)
            {
                //try again?
                //sftpFileAttributes = GetAttributes(path);

                LogFSActionError("FileInfo", fileName, (SftpContext)info.Context, "No such file - unable to get info");
                fileInfo = new FileInformation();
                return DokanError.ErrorFileNotFound;

            }

            fileInfo = new FileInformation
                           {
                               Attributes =
                                   FileAttributes.NotContentIndexed,
                               FileName = Path.GetFileName(fileName), //String.Empty,
                               // GetInfo info doesn't use it maybe for sorting .
                               CreationTime = sftpFileAttributes.LastWriteTime,
                               LastAccessTime = sftpFileAttributes.LastAccessTime,
                               LastWriteTime = sftpFileAttributes.LastWriteTime,
                               Length = sftpFileAttributes.Size
                           };
            if (sftpFileAttributes.IsDirectory)
            {
                fileInfo.Attributes |= FileAttributes.Directory;
                fileInfo.Length = 0; // Windows directories use length of 0
            }
            else
            {
                fileInfo.Attributes |= FileAttributes.Normal;
            }
            if (fileName.Length != 1 && fileName[fileName.LastIndexOf('\\') + 1] == '.')
                //aditional check if filename isn't \\
            {
                fileInfo.Attributes |= FileAttributes.Hidden;
            }

            if (GroupRightsSameAsOwner(sftpFileAttributes))
            {
                fileInfo.Attributes |= FileAttributes.Archive;
            }
            if (_useOfflineAttribute)
            {
                fileInfo.Attributes |= FileAttributes.Offline;
            }

            if (!this.UserCanWrite(sftpFileAttributes))
            {
                fileInfo.Attributes |= FileAttributes.ReadOnly;
            }
            //  Console.WriteLine(sftpattributes.UserId + "|" + sftpattributes.GroupId + "L" +
            //  sftpattributes.OthersCanExecute + "K" + sftpattributes.OwnerCanExecute);

            LogFSActionSuccess("FileInfo", fileName, (SftpContext)info.Context, "Length:{0} Attrs:{1}", fileInfo.Length, fileInfo.Attributes);

            return DokanError.ErrorSuccess;
        }
Пример #24
0
        public DokanError GetFileInformation(string fileName, out FileInformation fileInfo, DokanFileInfo info)
        {
            // may be called with info.Context=null , but usually it isn't
            string path = GetSPath(fileName);
            if (!Path.HasExtension(path))
            {
                fileInfo = createVirtualFile(FileAttributes.Directory, 0, fileName);

            }
            else
            {
                fileInfo = createVirtualFile(FileAttributes.Normal, 99000000, fileName);
            }

            return DokanError.ErrorSuccess;
        }
Пример #25
0
        DokanError IDokanOperations.GetFileInformation(string fileName, out FileInformation fileInfo,
                                                       DokanFileInfo info)
        {
            Log("GetInfo:{0}:{1}", fileName,info.Context);

            var context = info.Context as SftpContext;

            SftpFileAttributes sftpFileAttributes;
            if (context != null)
            {
                sftpFileAttributes = context.Attributes;
            }
            else
            {
                string path = GetUnixPath(fileName);
                sftpFileAttributes = _cache.Get(path) as SftpFileAttributes;

                if (sftpFileAttributes == null)
                {
                    sftpFileAttributes = GetAttributes(path);
                    if (sftpFileAttributes != null)
                        _cache.Add(path, sftpFileAttributes, DateTimeOffset.UtcNow.AddSeconds(_attributeCacheTimeout));
                }
            }


            fileInfo = new FileInformation
                           {
                               Attributes =
                                   FileAttributes.NotContentIndexed,
                               FileName = String.Empty,
                               // GetInfo info doesn't use it maybe for sorting .
                               CreationTime = sftpFileAttributes.LastWriteTime,
                               LastAccessTime = sftpFileAttributes.LastAccessTime,
                               LastWriteTime = sftpFileAttributes.LastWriteTime,
                               Length = sftpFileAttributes.Size
                           };
            if (sftpFileAttributes.IsDirectory)
            {
                fileInfo.Attributes |= FileAttributes.Directory;
                fileInfo.Length = 0; // Windows directories use length of 0 
            }
            else
            {
                fileInfo.Attributes |= FileAttributes.Normal;
            }
            if (fileName.Length != 1 && fileName[fileName.LastIndexOf('\\') + 1] == '.')
                //aditional check if filename isn't \\
            {
                fileInfo.Attributes |= FileAttributes.Hidden;
            }

            if (!UserCanWrite(sftpFileAttributes))
            {
                fileInfo.Attributes |= FileAttributes.ReadOnly;
            }
            if (_useOfflineAttribute)
            {
                fileInfo.Attributes |= FileAttributes.Offline;
            }
            //  Console.WriteLine(sftpattributes.UserId + "|" + sftpattributes.GroupId + "L" +
            //  sftpattributes.OthersCanExecute + "K" + sftpattributes.OwnerCanExecute);
            return DokanError.ErrorSuccess;
        }
Пример #26
0
        DokanError IDokanOperations.FindFiles(string fileName, out IList<FileInformation> files, DokanFileInfo info)
        {
            Log("FindFiles:{0}", fileName);

            var dircache = _cache.Get(fileName) as Tuple<DateTime, IList<FileInformation>>;
            if (dircache != null)
            {
                files = (dircache).Item2;
                Log("CacheHit:{0}", fileName);
                return DokanError.ErrorSuccess;
            }


            byte[] handle;
            try
            {
                handle = _sftpSession.RequestOpenDir(GetUnixPath(fileName));
            }
            catch (SftpPermissionDeniedException)
            {
                files = null;
                return DokanError.ErrorAccessDenied;
            }


            files = new List<FileInformation>();
            for (var sftpFiles = _sftpSession.RequestReadDir(handle);
                 sftpFiles != null;
                 sftpFiles = _sftpSession.RequestReadDir(handle))
            {

              


                (files as List<FileInformation>).AddRange(sftpFiles.Select(
                    file =>
                        {
                            var sftpFileAttributes = file.Value;
                            if (sftpFileAttributes.IsSymbolicLink)
                            {
                                sftpFileAttributes = _sftpSession.RequestStat(
                                    GetUnixPath(String.Format("{0}{1}", fileName, file.Key)), true) ??
                                                     file.Value;
                            }


                            var fileInformation = new FileInformation
                                                      {
                                                          Attributes =
                                                              FileAttributes.NotContentIndexed,
                                                          CreationTime
                                                              =
                                                              sftpFileAttributes
                                                              .
                                                              LastWriteTime,
                                                          FileName
                                                              =
                                                              file.Key
                                                          ,
                                                          LastAccessTime
                                                              =
                                                              sftpFileAttributes
                                                              .
                                                              LastAccessTime,
                                                          LastWriteTime
                                                              =
                                                              sftpFileAttributes
                                                              .
                                                              LastWriteTime,
                                                          Length
                                                              =
                                                              sftpFileAttributes
                                                              .
                                                              Size
                                                      };
                            if (sftpFileAttributes.IsDirectory)
                            {
                                fileInformation.Attributes
                                    |=
                                    FileAttributes.
                                        Directory;
                                fileInformation.Length = 0;
                            }
                            else
                            {
                                fileInformation.Attributes |= FileAttributes.Normal;
                            }
                            if (file.Key[0] == '.')
                            {
                                fileInformation.Attributes
                                    |=
                                    FileAttributes.
                                        Hidden;
                            }

                            if (
                                !UserCanWrite(
                                    sftpFileAttributes))
                            {
                                fileInformation.Attributes
                                    |=
                                    FileAttributes.
                                        ReadOnly;
                            }
                            if (_useOfflineAttribute)
                            {
                                fileInformation.Attributes
                                    |=
                                    FileAttributes.
                                        Offline;
                            }
                            return fileInformation;
                        }));



               int timeout = Math.Max(_attributeCacheTimeout + 2, _attributeCacheTimeout +  sftpFiles.Length / 10);

               foreach (
                    var file in
                        sftpFiles.Where(
                            pair => !pair.Value.IsSymbolicLink))
                {
                    _cache.Set(GetUnixPath(String.Format("{0}{1}", fileName, file.Key)), file.Value,
                               DateTimeOffset.UtcNow.AddSeconds(timeout));
                }
            }


            _sftpSession.RequestClose(handle);


            _cache.Add(fileName, new Tuple<DateTime, IList<FileInformation>>(
                                     (info.Context as SftpContext).Attributes.LastWriteTime,
                                     files),
                       DateTimeOffset.UtcNow.AddSeconds(Math.Max(_attributeCacheTimeout,
                                                                 Math.Min(files.Count, _directoryCacheTimeout))));

            return DokanError.ErrorSuccess;
        }
Пример #27
0
 public NtStatus FindStreams(string fileName, out IList<FileInformation> streams, DokanFileInfo info)
 {
     streams = new FileInformation[0];
     return DokanResult.NotImplemented;
 }
Пример #28
0
 public NtStatus GetFileInformation(string fileName, out FileInformation fileInfo, DokanFileInfo info)
 {
     fileInfo = new FileInformation();
     return DokanResult.Success;
 }
Пример #29
0
        public NtStatus FindFiles(string fileName, out IList<FileInformation> files, DokanFileInfo info)
        {
            string[] fileList = this.isoReader.GetFiles(fileName);
            string[] dirList = this.isoReader.GetDirectories(fileName);
            files = new List<FileInformation>();

            foreach(var file in fileList)
            {
                DiscUtils.DiscFileInfo srcFileInfo = this.isoReader.GetFileInfo(file);
                FileInformation finfo = new FileInformation();

                finfo.FileName = Path.GetFileName(file);
                finfo.Attributes = srcFileInfo.Attributes;
                finfo.CreationTime = srcFileInfo.CreationTime;
                finfo.LastAccessTime = srcFileInfo.LastAccessTime;
                finfo.LastWriteTime = srcFileInfo.LastWriteTime;
                finfo.Length = srcFileInfo.Length;

                files.Add(finfo);
            }

            foreach(var dir in dirList)
            {
                DiscUtils.DiscDirectoryInfo srcDirInfo = this.isoReader.GetDirectoryInfo(dir);
                FileInformation finfo = new FileInformation();

                finfo.FileName = Path.GetFileName(dir);
                finfo.Attributes = srcDirInfo.Attributes;
                finfo.CreationTime = srcDirInfo.CreationTime;
                finfo.LastAccessTime = srcDirInfo.LastAccessTime;
                finfo.LastWriteTime = srcDirInfo.LastWriteTime;

                files.Add(finfo);
            }

            return DokanResult.Success;
        }
Пример #30
0
        public NtStatus FindFiles(string fileName, out IList<FileInformation> files, DokanFileInfo info)
        {
            Debug.Print("[FindFiles] filename : {0}", fileName);

            string path = ToUnixStylePath(fileName);
            IList<Google.Apis.Drive.v2.Data.File> file_list = GetChildrenById(GetIdByPath(path));

            files = new List<FileInformation>();

            foreach (var file in file_list)
            {
                FileInformation finfo = new FileInformation()
                {
                    FileName = file.Title,
                    CreationTime = (file.CreatedDate.HasValue) ? file.CreatedDate.Value : new DateTime(1970, 1, 1),
                    LastAccessTime = new DateTime(1970, 1, 1),
                    LastWriteTime = new DateTime(1970, 1, 1),
                    Length = (file.FileSize.HasValue) ? file.FileSize.Value : 0,
                    Attributes = FileAttributes.NotContentIndexed,
                };

                if (IsDirectory(file))
                {
                    finfo.Attributes |= FileAttributes.Directory;
                    finfo.Length = 0;
                }

                files.Add(finfo);
            }

            return DokanResult.Success;
        }
Пример #31
0
        public DokanError GetFileInformation(
            string filename,
            out FileInformation fileinfo,
            DokanFileInfo info)
        {
            fileinfo = new FileInformation();
            if (filename == "\\")
            {
                fileinfo.Attributes = System.IO.FileAttributes.Directory;
                fileinfo.LastAccessTime = DateTime.Now;
                fileinfo.LastWriteTime = DateTime.Now;
                fileinfo.CreationTime = DateTime.Now;

                return DokanError.ErrorSuccess;
            }

            RegistryKey key = GetRegistoryEntry(filename);
            if (key == null)
                return DokanError.ErrorError;

            fileinfo.Attributes = System.IO.FileAttributes.Directory;
            fileinfo.LastAccessTime = DateTime.Now;
            fileinfo.LastWriteTime = DateTime.Now;
            fileinfo.CreationTime = DateTime.Now;

            return DokanError.ErrorSuccess;
        }
Пример #32
0
        public NtStatus GetFileInformation(string fileName, out FileInformation fileInfo, DokanFileInfo info)
        {
            Debug.Print("[GetFileInformation] fileName : {0}, info.Context : {1}", fileName, info.Context == null ? "null" : "notnull");

            string path = ToUnixStylePath(fileName);
            Google.Apis.Drive.v2.Data.File file_obj = GetFileById(GetIdByPath(path));

            fileInfo = new FileInformation()
            {
                FileName = file_obj.Title,
                CreationTime = (file_obj.CreatedDate.HasValue) ? file_obj.CreatedDate.Value : new DateTime(1970, 1, 1),
                LastAccessTime = new DateTime(1970, 1, 1),
                LastWriteTime = new DateTime(1970, 1, 1),
                Length = (file_obj.FileSize.HasValue) ? file_obj.FileSize.Value : 0,
                Attributes = FileAttributes.NotContentIndexed,
            };

            if (IsDirectory(file_obj))
            {
                fileInfo.Attributes |= FileAttributes.Directory;
                fileInfo.Length = 0;
            }

            return DokanResult.Success;
        }
Пример #33
0
 public NtStatus FindStreams(string fileName, out IList<FileInformation> streams, DokanFileInfo info)
 {
     streams = new FileInformation[0];
     return Trace("EnumerateNamedStreams", fileName, info, DokanResult.NotImplemented);
 }
Пример #34
0
 virtual public NtStatus GetFileInformation(string fileName, out DokanNet.FileInformation fileInfo, IDokanFileInfoWrapper info)
 {
     throw new NotImplementedException();
 }
Пример #35
0
        private static void Addto(FILL_FIND_DATA fill, DokanFileInfo rawFileInfo, FileInformation fi)
        {
            Debug.Assert(!String.IsNullOrEmpty(fi.FileName));
            long ctime = fi.CreationTime.ToFileTime();
            long atime = fi.LastAccessTime.ToFileTime();
            long mtime = fi.LastWriteTime.ToFileTime();
            var data = new WIN32_FIND_DATA
            {
                dwFileAttributes = fi.Attributes,
                ftCreationTime =
                                   {
                                       dwHighDateTime = (int) (ctime >> 32),
                                       dwLowDateTime = (int) (ctime & 0xffffffff)
                                   },
                ftLastAccessTime =
                                   {
                                       dwHighDateTime = (int) (atime >> 32),
                                       dwLowDateTime = (int) (atime & 0xffffffff)
                                   },
                ftLastWriteTime =
                                   {
                                       dwHighDateTime = (int) (mtime >> 32),
                                       dwLowDateTime = (int) (mtime & 0xffffffff)
                                   },
                nFileSizeLow = (uint)(fi.Length & 0xffffffff),
                nFileSizeHigh = (uint)(fi.Length >> 32),
                cFileName = fi.FileName
            };
            //ZeroMemory(&data, sizeof(WIN32_FIND_DATAW));

            fill(ref data, rawFileInfo);
        }
Пример #36
0
        public NtStatus GetFileInformation(string fileName, out FileInformation fileInfo, DokanFileInfo info)
        {
            SftpFile file = sftpClient.Get(ToUnixStylePath(fileName));

            fileInfo = new FileInformation()
            {
                FileName = file.Name,
                Attributes = FileAttributes.NotContentIndexed,
                CreationTime = file.LastWriteTime,
                LastAccessTime = file.LastAccessTime,
                LastWriteTime = file.LastWriteTime,
                Length = file.Length
            };

            if (file.IsDirectory)
            {
                fileInfo.Attributes |= FileAttributes.Directory;
                fileInfo.Length = 0;
            }
            else
            {
                fileInfo.Attributes |= FileAttributes.Normal;
            }

            if (fileInfo.FileName.StartsWith("."))
            {
                fileInfo.Attributes |= FileAttributes.Hidden;
            }

            // todo :
            // readonly check

            return DokanResult.Success;
        }