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, }; }
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, }; }
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, }; }
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, }; }
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; }
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); }
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; }
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; } }
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; }
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; }
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; }
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; } }
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; }
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; }
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; } }
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); }
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; }
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; } }
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); }
public NtStatus GetFileInformation(string fileName, out DokanNet.FileInformation fileInfo, DokanFileInfo info) { return(implementation.GetFileInformation(fileName, out fileInfo, new PassthruDFI(info))); }
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; }
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; }
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; }
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; }
public NtStatus FindStreams(string fileName, out IList<FileInformation> streams, DokanFileInfo info) { streams = new FileInformation[0]; return DokanResult.NotImplemented; }
public NtStatus GetFileInformation(string fileName, out FileInformation fileInfo, DokanFileInfo info) { fileInfo = new FileInformation(); return DokanResult.Success; }
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; }
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; }
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; }
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; }
public NtStatus FindStreams(string fileName, out IList<FileInformation> streams, DokanFileInfo info) { streams = new FileInformation[0]; return Trace("EnumerateNamedStreams", fileName, info, DokanResult.NotImplemented); }
virtual public NtStatus GetFileInformation(string fileName, out DokanNet.FileInformation fileInfo, IDokanFileInfoWrapper info) { throw new NotImplementedException(); }
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); }
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; }