CClash.HashUtil.ThreadyDigestFiles C# (CSharp) Method

ThreadyDigestFiles() public method

public ThreadyDigestFiles ( IEnumerable files, bool stopOnUnCachable ) : DataHash>.Dictionary
files IEnumerable
stopOnUnCachable bool
return DataHash>.Dictionary
        public Dictionary<string, DataHash> ThreadyDigestFiles(IEnumerable<string> files, bool stopOnUnCachable)
        {
            lock (includeCache)
            {
                var fcount = files.Count();
                var rv = new Dictionary<string, DataHash>();
                var threadcount = HashingThreadCount;
                if ((threadcount < 2) || (fcount < threadcount))
                {
                    Logging.Emit("st hash {0} files", fcount);
                    foreach (var f in files)
                    {
                        var d = DigestSourceFile(f);
                        rv[f.ToLower()] = d;
                        if (d.Result != DataHashResult.Ok) break;
                    }
                }
                else
                {
                    Logging.Emit("mt hash {0} files on {1} threads", fcount, threadcount);
                    var fa = files.ToArray();
                    var tl = new List<Thread>();
                    var taken = 0;
                    var chunk = (1 + fcount / (threadcount));
                    if (chunk < 1) chunk = 1;

                    var inputs = new List<ThreadyDigestInput>();

                    do
                    {
                        var input = new ThreadyDigestInput()
                        {
                            files = fa,
                            results = new List<DataHash>(),
                            provider = new MD5CryptoServiceProvider(),
                            begin = taken,
                            chunksize = chunk,
                            stopOnCachable = stopOnUnCachable,
                        };

                        var t = new Thread(ThreadyDigestWorker);
                        taken += chunk;
                        t.Start(input);
                        inputs.Add(input);
                        tl.Add(t);
                    } while (taken < fcount);

                    for (var i = 0; i < tl.Count; i++)
                    {
                        var t = tl[i];
                        t.Join(); // thread finished, store it's results
                        foreach (var h in inputs[i].results)
                        {
                            rv[h.InputName.ToLower()] = h;
                        }
                    }
                }

                return rv;
            }
        }

Usage Example

Example #1
0
        public void ThreadyHashIncludeFiles()
        {
            using (var ic = FileCacheStore.Load("testincs"))
            {
                var ht = new HashUtil(ic);

                var hashes = ht.ThreadyDigestFiles(Directory.GetFiles(IncludeDir), true);
                Assert.IsTrue(hashes.Count > 0);
            }
        }
All Usage Examples Of CClash.HashUtil::ThreadyDigestFiles