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);
        }
 private bool IsNormalFile(string fileName, IDokanFileInfo info, out BlobFile cachedFile)
 {
     cachedFile = _cached.GetOrAdd(fileName, fn => new BlobFile(_containerClient, fn, info, _cacheDirectory));
     return(cachedFile.IsNormalFile);
 }
        public NtStatus GetFileInformation(string fileName, out FileInformation fileInfo, IDokanFileInfo info)
        {
            var isFile = IsNormalFile(fileName, info, out var file);

            if (file.Exists())
            {
                var properties = file.BlobClient.GetProperties();
                fileInfo = new FileInformation
                {
                    Attributes     = isFile ? FileAttributes.Normal : FileAttributes.Directory,
                    Length         = properties.Value.ContentLength,
                    CreationTime   = properties.Value.CreatedOn.LocalDateTime, FileName = BlobFile.GetFileName(fileName),
                    LastAccessTime = properties.Value.LastModified.LocalDateTime,
                    LastWriteTime  = properties.Value.LastModified.LocalDateTime
                };
                return(DokanResult.Success);
            }

            fileInfo = new FileInformation();
            return(DokanResult.AccessDenied);
        }