예제 #1
0
        private QueryResultItem CreateResult(uint resultIndex, Func <string, QueryResultItem> make)
        {
            var pathBuilder = new StringBuilder(260);

            EverythingDll.Everything_GetResultFullPathNameW(resultIndex, pathBuilder, (uint)pathBuilder.Capacity);
            return(make.Invoke(pathBuilder.ToString()));
        }
예제 #2
0
        public async IAsyncEnumerable <QueryResultItem> GetCurrentResult([EnumeratorCancellation] CancellationToken ct = default)
        {
            var numResults = EverythingDll.Everything_GetNumResults();

            if (numResults == 0)
            {
                yield break;
            }

            var collection = new BlockingCollection <QueryResultItem>();

            _ = Task.Run(() =>
            {
                Parallel.For(0, numResults, body: i =>
                {
                    QueryResultItem item = null;
                    var index            = (uint)i;

                    switch (GetResultType(index))
                    {
                    case ResultType.Unknown:
                        break;

                    case ResultType.File:
                        item = CreateResult(index, MakeFile);
                        break;

                    case ResultType.Directory:
                        item = CreateResult(index, MakeDir);
                        break;

                    case ResultType.Volume:
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }

                    collection.Add(item, ct);
                }, parallelOptions: new ParallelOptions {
                    CancellationToken = ct
                });

                collection.CompleteAdding();
            }, ct);

            foreach (var result in collection.GetConsumingEnumerable())
            {
                yield return(result);
            }
        }
예제 #3
0
 private ResultType GetResultType(uint index)
 {
     if (EverythingDll.Everything_IsFileResult(index))
     {
         return(ResultType.File);
     }
     if (EverythingDll.Everything_IsFolderResult(index))
     {
         return(ResultType.Directory);
     }
     if (EverythingDll.Everything_IsVolumeResult(index))
     {
         return(ResultType.Volume);
     }
     return(ResultType.Unknown);
 }
예제 #4
0
 public void Dispose()
 {
     EverythingDll.Everything_Reset();
 }