예제 #1
0
        public NtStatus FindFilesWithPattern([NotNull] string fileName, string searchPattern, out IList <FileInformation> files, [NotNull] IDokanFileInfo info)
        {
            bool Predicate(FileSystemInfo finfo)
            {
                return(finfo != null && DokanHelper.DokanIsNameInExpression(searchPattern, finfo.Name, true));
            }

            IEnumerable <FileSystemInfo> mineQuery = new DirectoryInfo(GetMinePath(fileName)).EnumerateFileSystemInfos().Where(Predicate);
            IEnumerable <FileSystemInfo> baseQuery = new DirectoryInfo(GetBasePath(fileName)).EnumerateFileSystemInfos().Where(Predicate);

            files = mineQuery
                    // grab all form mine & merge with all from base that arent in mine
                    .Union(baseQuery, _FileSystemInfoComparer)
                    .Select(o => {
                Debug.Assert(o != null, nameof(o) + " != null");
                return(new FileInformation {
                    Attributes = o.Attributes,
                    CreationTime = o.CreationTime,
                    LastAccessTime = o.LastAccessTime,
                    LastWriteTime = o.LastWriteTime,
                    Length = (o as FileInfo)?.Length ?? 0,
                    FileName = o.Name
                });
            })
                    .ToArray();

            return(DokanResult.Success);
        }
예제 #2
0
        public IList <FileInformation> FindFilesHelper(string fileName, string searchPattern)
        {
            IList <FileInformation> files = new List <FileInformation>();
            IList <FileInformation> tmp;

            foreach (FS fs in fsl)
            {
                if (Directory.Exists(combine(fs.TLD, fileName)) || File.Exists(combine(fs.TLD, fileName)))
                {
                    tmp = new DirectoryInfo(combine(fs.TLD, fileName))
                          .EnumerateFileSystemInfos()
                          .Where(finfo => DokanHelper.DokanIsNameInExpression(searchPattern, finfo.Name, true))
                          .Select(finfo => new FileInformation
                    {
                        Attributes     = finfo.Attributes,
                        CreationTime   = finfo.CreationTime,
                        LastAccessTime = finfo.LastAccessTime,
                        LastWriteTime  = finfo.LastWriteTime,
                        Length         = (finfo as FileInfo)?.Length ?? 0,
                        FileName       = finfo.Name
                    }).ToArray();
                    files = files.Union(tmp, new FileCompInfo()).ToArray();
                }
            }
            return(files);
        }
예제 #3
0
파일: SharedClass.cs 프로젝트: zhouzu/nlcfs
        public FileInfo[] FindFilesHelper(string fileName, string searchPattern)
        {
            var files = new DirectoryInfo(TranslatePath(fileName))
                        .EnumerateFileSystemInfos()
                        .Where(finfo => DokanHelper.DokanIsNameInExpression(searchPattern, finfo.Name, true))
                        .Select(finfo => new FileInfo(finfo.FullName))
                        .ToArray();

            return(files);
        }
 public IList <FileInformation> FindFilesHelper(string fileName, IDokanFileInfo info, string searchPattern)
 {
     return(FindFileNode(fileName, info)
            .mChildren
            .Where(finfo => DokanHelper.DokanIsNameInExpression(searchPattern, finfo.mNodeEntry.Name, true))
            .Select(finfo => new FileInformation
     {
         Attributes = finfo.IsDirectory() ? FileAttributes.Directory : FileAttributes.ReadOnly,
         CreationTime = DefaultCreationTime,
         LastAccessTime = DefaultLastAccessTime,
         LastWriteTime = finfo.mNodeEntry.LastWriteTime.DateTime,
         Length = finfo.mNodeEntry.Length,
         FileName = finfo.mNodeEntry.Name
     }).ToArray());
 }
예제 #5
0
 public NtStatus FindFilesWithPattern([NotNull] string fileName, [NotNull] string searchPattern, out IList <FileInformation> files, [NotNull] IDokanFileInfo info)
 {
     files = new DirectoryInfo(GetMinePath(fileName))
             .EnumerateFileSystemInfos()
             .Where(finfo => finfo != null && DokanHelper.DokanIsNameInExpression(searchPattern, finfo.Name, true))
             .Select(finfo => new FileInformation {
         Attributes     = finfo.Attributes,
         CreationTime   = finfo.CreationTime,
         LastAccessTime = finfo.LastAccessTime,
         LastWriteTime  = finfo.LastWriteTime,
         Length         = (finfo as FileInfo)?.Length ?? 0,
         FileName       = finfo.Name
     }).ToArray();
     return(DokanResult.Success);
 }
예제 #6
0
        public IList <FileInformation> FindFilesHelper(string fileName, string searchPattern)
        {
            IList <FileInformation> files = new DirectoryInfo(GetPath(fileName))
                                            .EnumerateFileSystemInfos()
                                            .Where(finfo => DokanHelper.DokanIsNameInExpression(searchPattern, finfo.Name, true))
                                            .Select(finfo => new FileInformation
            {
                Attributes     = finfo.Attributes,
                CreationTime   = finfo.CreationTime,
                LastAccessTime = finfo.LastAccessTime,
                LastWriteTime  = finfo.LastWriteTime,
                Length         = (finfo as FileInfo)?.Length ?? 0,
                FileName       = finfo.Name
            }).ToArray();

            return(files);
        }
예제 #7
0
        private IList <FileInformation> _RealEnumerateChildren(string filePath, string searchPattern)
        {
            filePath = filePath?.Replace("\\", "/");
            var items = RootFs.EnumerateChildrenAsync(filePath).AsTask().Result;
            IList <FileInformation> files = items
                                            .Where(finfo => DokanHelper.DokanIsNameInExpression(searchPattern, finfo.Name, true))
                                            .Select(finfo => new FileInformation {
                Attributes     = FileAttributes.Normal | (finfo.IsDirectory ? FileAttributes.Directory : 0) | (finfo.IsHidden ? FileAttributes.Hidden : 0),// | (finfo.IsReadOnly ? FileAttributes.ReadOnly : 0),
                CreationTime   = finfo.CreationDate,
                LastAccessTime = null,
                LastWriteTime  = null,
                Length         = finfo.Size ?? 0,
                FileName       = finfo.Name
            }).ToArray();

            //Logger.LogTrace($"_RealEnumerateChildren {filePath} received {items.Count} item(s), return {files.Count} file(s)");
            return(files);
        }
예제 #8
0
        private IList <FileInformation> _RealEnumerateChildren(string filePath, string searchPattern)
        {
            filePath = filePath?.Replace("\\", "/");
            var items = _PersonalCloud.RootFS.EnumerateChildrenAsync(filePath).ConfigureAwait(false).GetAwaiter().GetResult();
            IList <FileInformation> files = items
                                            .Where(finfo => DokanHelper.DokanIsNameInExpression(searchPattern, finfo.Name, true))
                                            .Select(finfo => new FileInformation {
                Attributes     = FileAttributes.Normal | (finfo.IsDirectory ? FileAttributes.Directory : 0) | (finfo.IsHidden ? FileAttributes.Hidden : 0),// | (finfo.IsReadOnly ? FileAttributes.ReadOnly : 0),
                CreationTime   = finfo.CreationDate,
                LastAccessTime = null,
                LastWriteTime  = null,
                Length         = finfo.Size ?? 0,
                FileName       = finfo.Name
            }).ToArray();

            Console.WriteLine($"_RealEnumerateChildren received {items.Count} item(s), return {files.Count} file(s)");
            return(files);
        }
        public NtStatus FindFilesWithPattern(string fileName, string searchPattern, out IList <FileInformation> files,
                                             IDokanFileInfo info)
        {
            if (!IsNormalFile(fileName, info, out var cachedDir))
            {
                files = _containerClient
                        .GetBlobsByHierarchy(
                    prefix: cachedDir.BlobClient.Name.Replace(BlobFile.DirectoryFileName, string.Empty))
                        .Where(f => !f.Blob.Name.EndsWith(
                                   $"{BlobFile.DefaultDirectorySeparator}{BlobFile.DirectoryFileName}") &&
                               DokanHelper.DokanIsNameInExpression(searchPattern, fileName, true))
                        .Select(f =>
                {
                    var fi        = new FileInformation();
                    fi.FileName   = BlobFile.GetFileName(f.Blob.Name);
                    fi.Attributes = f.Blob.Name.EndsWith(BlobFile.DefaultDirectorySeparator)
                            ? FileAttributes.Directory
                            : FileAttributes.Normal;
                    if (f.Blob.Properties.ContentLength.HasValue)
                    {
                        fi.Length = f.Blob.Properties.ContentLength.Value;
                    }
                    if (f.Blob.Properties.CreatedOn.HasValue)
                    {
                        fi.CreationTime = f.Blob.Properties.CreatedOn.Value.LocalDateTime;
                    }
                    if (f.Blob.Properties.LastModified != null)
                    {
                        fi.LastAccessTime = f.Blob.Properties.LastModified.Value.LocalDateTime;
                        fi.LastWriteTime  = f.Blob.Properties.LastModified.Value.LocalDateTime;
                    }

                    return(fi);
                })
                        .ToList();
                return(DokanResult.Success);
            }

            files = new List <FileInformation>();
            return(DokanResult.FileNotFound);
        }
예제 #10
0
        public IList <FileInformation> FindFilesHelper(string fileName, string searchPattern)
        {
            IList <FileInformation> files = new List <FileInformation>();
            // Hashset to check if a file is just added
            HashSet <string> filesAdded = new HashSet <string>();

            // First add logical files
            int fileSlashCount = 1;

            if (fileName != @"\")
            {
                fileSlashCount = countCharInsideString(fileName, '\\') + 1;
            }

            // Scan Logical entries
            foreach (string logicalPath in dirConf.Keys)
            {
                // Ignore root logical path
                if (logicalPath == @"\")
                {
                    continue;
                }

                // Check backslash and root folder
                int slashCount = countCharInsideString(logicalPath, '\\');
                if (slashCount != fileSlashCount || !logicalPath.StartsWith(fileName))
                {
                    continue;
                }

                // Translate the path
                string dirName = GetFolderName(logicalPath);

                // If file just added before ignore and go on
                if (filesAdded.Contains(dirName))
                {
                    continue;
                }

                // If not match the searchPattern  ignore and go on
                if (!DokanHelper.DokanIsNameInExpression(searchPattern, dirName, true))
                {
                    continue;
                }

                // Add a directory
                var finfo = new FileInformation
                {
                    FileName       = dirName,
                    Attributes     = FileAttributes.Directory,
                    LastAccessTime = DateTime.Now,
                    LastWriteTime  = null,
                    CreationTime   = null
                };
                files.Add(finfo);
                filesAdded.Add(finfo.FileName);
            }

            // Get real dirs from logical paths
            string[] realDirs = GetPaths(fileName);
            // Scan real dirs
            foreach (string realDir in realDirs)
            {
                // If the directory not exist skip it
                if (!Directory.Exists(realDir))
                {
                    continue;
                }
                // Get file list from real dir
                IEnumerable <FileInformation> fEnum = new DirectoryInfo(realDir)
                                                      .EnumerateFileSystemInfos()
                                                      .Where(finfo => DokanHelper.DokanIsNameInExpression(searchPattern, finfo.Name, true))
                                                      .Select(finfo => new FileInformation
                {
                    Attributes     = finfo.Attributes,
                    CreationTime   = finfo.CreationTime,
                    LastAccessTime = finfo.LastAccessTime,
                    LastWriteTime  = finfo.LastWriteTime,
                    Length         = (finfo as FileInfo)?.Length ?? 0,
                    FileName       = finfo.Name
                });
                // Merge to existing list and discard doubles
                files = files.Union(fEnum).GroupBy(o => o.FileName).Select(g => g.First()).ToList();
            }
            // Return the complete file list
            return(files);
        }