Пример #1
0
        public void Search(string path, DirItem parent)
        {
            string[] filePaths;
            string[] dirPaths;
            try
            {
                filePaths = dirAccess.GetFiles(path);
                dirPaths  = dirAccess.GetDirectories(path);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Try to access " + path + " " + ex.Message);
                return;
            }

            parent.Init(filePaths.Length, dirPaths.Length);
            for (int i = 0; i < filePaths.Length; ++i)
            {
                var item = new FileItem(filePaths[i]);
                parent.AddFile(item);
            }

            for (int i = 0; i < dirPaths.Length; ++i)
            {
                var dirPath = dirPaths[i];
                var item    = new DirItem(dirPath, parent.Level + 1);
                parent.AddDir(item);
                Search(dirPath, item);
            }
        }
        private static async Task ProvideThumbnail(HttpListenerRequest request, HttpListenerResponse response)
        {
            var param     = request.RequestUri.ParseQueryParameters();
            var sessionId = param.GetByKey(Consts.SessionId);
            var itemId    = param.GetByKey(Consts.ItemId);

            //Env.Logger.Log("Get Thumbnail start " + itemId, "Http");
            bool            provided = false;
            BrowseResponder br       = SuperDriveCore.Conversations.GetByKey(sessionId) as BrowseResponder;

            if (br != null)
            {
                DirItem dir = br.CurrentFolder;
                var     f   = dir?.Children.FirstOrDefault(d => d.Id == itemId) as FileItem;
                if (f != null)
                {
                    //不能在这里关闭流。因为response的close函数里面会使用这个流。想要关闭,除非
                    //把内容复制给OutputStream.
                    using (var rep = response)
                    {
                        response.OutputStream = await Env.FileSystem.GetThumbnailStream(f);

                        provided = true;
                        Env.Logger.Log("Get Thumbnail End " + itemId, "Http");
                    }
                }
            }

            if (!provided)
            {
                response.NotFound();
                response.Dispose();
            }
        }
        //如果用户先请求浏览一个目录,等一下又请求浏览另外的目录,那怎么操作?
        public Task <IEnumerable <Item> > GetDirChildren(DirItem dir, TaskCompletionSource <ConversationMessage> response = null)
        {
            if (dir.Equals(CurrentDir) && _listResult != null)
            {
                return(_listResult.Task);                //如果已经请求过了,而且两次请求的内容相同,就等待上次返回结果。
            }
            //表示别人请求过。让上一次的请求返回null。
            _listResult?.TrySetResult(null);

            CurrentDir  = dir;
            _listResult = new TaskCompletionSource <IEnumerable <Item> >();
            _listResult.SetValueWhenTimeout(TimeSpan.FromSeconds(Consts.DefaultConnectTimeoutSeconds), null);
            _currentRequest = new BrowseRequestMessage {
                DirItemId = dir.Id
            };
            //Env.Logger.Log($"Post Message {_currentRequest}", nameof(RemoteBrowser));
            var postTask = _conversation.PostMessage(_currentRequest);

            postTask.ConfigureAwait(false);
            if (postTask.Result)
            {
                return(_listResult.Task);
            }

            _listResult.TrySetResult(null);
            response?.TrySetResult(null);
            return(_listResult.Task);
        }
Пример #4
0
        internal void ProcessReceiveListChildItems(DirItem item)
        {
            if (item == null)
            {
                return;
            }

            var items = receiveList.Where(o => o.Value != null && o.Value.Type == ItemType.File);

            if (items.Count() > 0)
            {
                foreach (var i in items)
                {
                    var parent = i.Value.Parent;
                    while (parent != null)
                    {
                        lock (i.Value)
                        {
                            if (parent != null && parent.ID == item.ID)
                            {
                                i.Value.TransferState = item.TransferState;
                                break;
                            }
                            else
                            {
                                parent = parent.Parent;
                            }
                        }
                    }
                }
            }
        }
Пример #5
0
        public Dir ReadDir(int index)
        {
            Dir dir = new Dir();

            dir.DirItems = new List <DirItem>();
            byte[] bytes = ReadBiteFile(index);

            int i, count = 4;

            //字节解析为目录
            dir.Size = BitConverter.ToInt32(bytes, 0);
            for (i = 0; i < dir.Size; i++)
            {
                DirItem dirItem = new DirItem();
                dirItem.NameSize = BitConverter.ToInt32(bytes, count);
                count           += 4;
                dirItem.Name     = System.Text.Encoding.Default.GetString(bytes, count, dirItem.NameSize);
                count           += dirItem.NameSize;
                dirItem.Inode    = BitConverter.ToInt32(bytes, count);
                count           += 4;
                dir.DirItems.Add(dirItem);
            }

            return(dir);
        }
Пример #6
0
 public DirItem(string dirPath)
 {
     DirPath             = dirPath;
     Files               = new List <FileItem>();
     IsConfig            = false;
     Altas               = false;
     NearestConfigParent = null;
 }
Пример #7
0
        internal async Task <List <AbstractFileItem> > GetChildren(DirItem dir)
        {
            var result = await GetChildrenImpl(dir);

            foreach (var af in result)
            {
                af.ConversationID = dir.ConversationID;
            }
            return(result);
        }
Пример #8
0
        public byte[] ToBytes(DirItem dirItem)
        {
            List <byte> bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(dirItem.NameSize).ToList());
            bytes.AddRange(System.Text.Encoding.Default.GetBytes(dirItem.Name).ToList());
            bytes.AddRange(BitConverter.GetBytes(dirItem.Inode));

            return(bytes.ToArray());
        }
Пример #9
0
        public DirItem Load(string rootPath)
        {
            var dir = new DirectoryInfo(rootPath);

            var root = new DirItem {
                Path = rootPath
            };

            LoadRecursive(root, dir);

            return(root);
        }
Пример #10
0
 public MainViewModel()
 {
     ExitCommand       = new Command(() => Application.Current.Shutdown());
     SelectItemCommand = new Command(SelectItem);
     if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
     {
         Root = new DirItem();
     }
     else
     {
         WinConsole.Initialize();
         Root = FileTreeLoader.Instance.Load(@"U:\Data");
     }
 }
        internal void ProcessResponse(BrowseResponseMessage rep)
        {
            if (rep == null || rep.BrowserId != _currentRequest?.BrowserId)
            {
                return;
            }

            CurrentDir = rep.CurrentDir;
            foreach (var item in rep.Items)
            {
                item.Parent = rep.CurrentDir;
            }
            _listResult?.TrySetResult(rep.Items);
            _listResult = null;
        }
Пример #12
0
        public Task <IEnumerable <Item> > GetDirChildren(DirItem dir)
        {
            CurrentDir = dir;
            //为上一次的GetItems请求返回null。
            _getItemsTcs?.TrySetResult(null);

            _getItemsTcs = new TaskCompletionSource <IEnumerable <Item> >();
            _getItemsTcs.SetValueWhenTimeout(TimeSpan.FromSeconds(DefaultConnectTimeoutSeconds), null);

            Task.Run(() =>
            {
                var ch = dir.Children;
                _getItemsTcs.SetResult(ch);
            });
            return(_getItemsTcs.Task);
        }
Пример #13
0
 public void AddDirItems(string folderPath, IList <FSItem> items)
 {
     lok.EnterWriteLock();
     try
     {
         pathToDirItem[folderPath] = new DirItem(items.Select(i => i.Path).ToList(), DirItemsExpirationSeconds);
         foreach (var item in items)
         {
             pathToNode[item.Path] = item;
         }
     }
     finally
     {
         lok.ExitWriteLock();
     }
 }
Пример #14
0
        void LoadRecursive(DirItem dirItem, DirectoryInfo dir)
        {
            dirItem.Items.AddRange(GetFiles(dir));

            foreach (var currentDir in dir.EnumerateDirectories())
            {
                var childdir = new DirItem
                {
                    Name = currentDir.Name,
                    Path = currentDir.FullName
                };

                dirItem.Items.Add(childdir);

                LoadRecursive(childdir, currentDir);
            }
        }
        protected internal override async void OnMessageReceived(ConversationMessage message)
        {
            var brMessage = message as BrowseRequestMessage;

            if (brMessage == null)
            {
                return;
            }

            #region comment
            //TODO 如果是安卓又该如何处理?首先需要搞清楚这是在分类浏览,还是在浏览目录,如果是在浏览目录,这个代码可用
            //如果是在分类浏览,那么需要去数据库中查询,并返回列表。

            //如果安卓做分类浏览,那么分类浏览中有没有子目录的概念?有的图库中有多个相册,是如何处理的?多个相册看起来像是文件夹的概念。

            //TODO 新拍摄的图片之类的,没有立即存储到MediaStore,如何处理?
            //TODO 如果有生成并缓存缩略图,那些缩略图要被MediaStore忽略才行。

            //http://blog.csdn.net/yhcelebrite/article/details/11714925
            //http://blog.csdn.net/bgc525725278/article/details/8131657
            #endregion

            var respondMessage = await BrowseResponseUtil.Response(this, brMessage);

            if (CurrentFolder?.Children.FirstOrDefault(c => c.Id == respondMessage.CurrentDir?.Id) != null)
            {
                //如果这次要求浏览的目录是上次浏览的目录的子目录
                //CurrentFolder.FolderString
                respondMessage.CurrentDir.Parent = CurrentFolder;
            }
            CurrentFolder = respondMessage.CurrentDir;
            if (CurrentFolder != null)
            {
                if (NamedFolders.IsNamedFolderId(CurrentFolder.Id))
                {
                    _browseHistories.Clear();                     //已经到顶层目录,不会再有返回操作。
                }
                _browseHistories.Add(CurrentFolder);
            }
            PostMessageAsync(respondMessage);
        }
Пример #16
0
 private static void GroupNearestConfig()
 {
     // 非配置项 dir
     foreach (var pair in dirItems)
     {
         DirItem origin  = pair.Value;
         DirItem item    = origin;
         string  dirName = item.DirPath;
         while (item != null)
         {
             if (item.IsConfig)
             {
                 origin.NearestConfigParent = item;
                 break;
             }
             item    = null;
             dirName = Path.GetDirectoryName(dirName).Replace("\\", "/");
             if (dirItems.ContainsKey(dirName))
             {
                 item = dirItems[dirName];
             }
         }
     }
 }
Пример #17
0
 private static void GetDependences(string path, bool recursive, Dictionary <string, DirItem> dirItems, Dictionary <string, FileItem> fileItems)
 {
     string[] dependencies = AssetDatabase.GetDependencies(path.Replace("\\", "/"), recursive);
     foreach (string dependence in dependencies)
     {
         string filePath = dependence.Replace("\\", "/");
         string fileKey  = filePath.Replace("Assets/", "");
         if (!fileItems.ContainsKey(fileKey))
         {
             fileItems.Add(fileKey, new FileItem()
             {
                 FilePath = filePath, Levels = 0
             });
             string dirName = Path.GetDirectoryName(fileKey).Replace("\\", "/");
             if (!dirItems.ContainsKey(dirName))
             {
                 DirItem result = new DirItem(dirName);
                 dirItems.Add(dirName, result);
             }
             dirItems[dirName].Files.Add(fileItems[fileKey]);
         }
         fileItems[fileKey].Levels++;
     }
 }
Пример #18
0
 public Task <IEnumerable <Item> > GetDirChildren(DirItem dir) => _rbu.GetDirChildren(dir);
Пример #19
0
        /// <summary>
        /// 如果已经存在,或者创建成功,都返回true
        /// </summary>
        /// <param name="dir"></param>
        /// <returns></returns>
        internal bool GetOrCreateDir(DirItem dir)
        {
            DirectoryInfo di = Directory.CreateDirectory(dir.AbsolutePath);

            return(di != null);
        }
Пример #20
0
 protected abstract Task <List <AbstractFileItem> > GetChildrenImpl(DirItem dir);
Пример #21
0
 public static async Task <List <AbstractFileItem> > GetFiles(DirItem dir)
 {
     return(await _instance.GetFilesImpl(dir));
 }
Пример #22
0
        private BaseItem CreateItem(NodeItem item, byte[] buffer, int offset)
        {
            var      data = EndianUtilities.ToByteArray(buffer, (int)(offset + item.DataOffset), (int)item.DataSize);
            BaseItem result;

            switch (item.Key.ItemType)
            {
            case ItemType.ChunkItem:
                result = new ChunkItem(item.Key);
                break;

            case ItemType.DevItem:
                result = new DevItem(item.Key);
                break;

            case ItemType.RootItem:
                result = new RootItem(item.Key);
                break;

            case ItemType.InodeRef:
                result = new InodeRef(item.Key);
                break;

            case ItemType.InodeItem:
                result = new InodeItem(item.Key);
                break;

            case ItemType.DirItem:
                result = new DirItem(item.Key);
                break;

            case ItemType.DirIndex:
                result = new DirIndex(item.Key);
                break;

            case ItemType.ExtentData:
                result = new ExtentData(item.Key);
                break;

            case ItemType.RootRef:
                result = new RootRef(item.Key);
                break;

            case ItemType.RootBackref:
                result = new RootBackref(item.Key);
                break;

            case ItemType.XattrItem:
                result = new XattrItem(item.Key);
                break;

            case ItemType.OrphanItem:
                result = new OrphanItem(item.Key);
                break;

            default:
                throw new IOException($"Unsupported item type {item.Key.ItemType}");
            }
            result.ReadFrom(data, 0);
            return(result);
        }
 public Task <IEnumerable <Item> > GetDirChildren(DirItem dir) => _browseRequestHelper.GetDirChildren(dir);
Пример #24
0
 protected abstract Task <List <AbstractFileItem> > GetFilesImpl(DirItem dir);