private void analyzeKickAssArchive(String archiveLocation) { MemoryMappedFile memoryMappedArchive = MemoryMappedFile.CreateFromFile(archiveLocation, FileMode.Open); Encoding encoding = Encoding.GetEncoding("iso-8859-1"); // get extended Ascii Encoding int maxOffset = 1000000; int start = startingBlock * maxOffset + 1000; int overlap = 1000; waitForThreadPoolEvent = new ManualResetEvent(false); threadPoolCounter = archiveBlockCount; // TODO: change when you change the file, also, progress bar maximum value needs to change accordingly MemoryMappedViewAccessor memoryMappedAccessor; ArchiveBlockArguments archiveBlockArguments; for (int i = startingBlock; i < threadPoolCounter - 1; i++) { memoryMappedAccessor = memoryMappedArchive.CreateViewAccessor(start - overlap, maxOffset + overlap); archiveBlockArguments = new ArchiveBlockArguments(encoding, memoryMappedAccessor, maxOffset + overlap, start - overlap, i); ThreadPool.QueueUserWorkItem(new WaitCallback(analyzeArchiveBlock), archiveBlockArguments); start += maxOffset; } // last block: memoryMappedAccessor = memoryMappedArchive.CreateViewAccessor(start - overlap, archiveSize - (start - overlap)); archiveBlockArguments = new ArchiveBlockArguments(encoding, memoryMappedAccessor, maxOffset + overlap, start - overlap, threadPoolCounter); ThreadPool.QueueUserWorkItem(new WaitCallback(analyzeArchiveBlock), archiveBlockArguments); waitForThreadPoolEvent.WaitOne(); //MemoryMappedViewAccessor memoryMappedAccessor = memoryMappedArchive.CreateViewAccessor(0, 1498824695); }
private void analyzeArchiveBlock(Object obj) { ArchiveBlockArguments arguments = (ArchiveBlockArguments)obj; Encoding encoding = arguments.encoding; MemoryMappedViewAccessor memoryMappedAccessor = arguments.memoryMappedAccessor; int maxOffset = arguments.maxOffset; int startingPoint = arguments.startingPoint; int blockNr = arguments.blockNr; Byte[] bytes = new Byte[maxOffset]; for (int i = 0; i < maxOffset; i++) { Byte b = memoryMappedAccessor.ReadByte(i); bytes[i] = b; } //String s = System.Text.Encoding.ASCII.GetString(bts); //works as well String archiveBlock = encoding.GetString(bytes); //Program.debug("Current Thread Id: " + Thread.CurrentThread.ManagedThreadId + " is analyzing Archive Block of size: " + maxOffset); //Regex regex = new Regex("<div class=\"torrentname\">" + @"\s*" + "<a href=\"" + @"[^ ]*"); Regex regex = new Regex("http://kickass.to/[^.]*.html"); MatchCollection mc = regex.Matches(archiveBlock); foreach (Match m in mc) { analyzeTorrentPage(m.ToString(), 0); } memoryMappedAccessor.Dispose(); Program.debug("Thread " + Thread.CurrentThread.ManagedThreadId + " finished analyzing memory block starting from: " + startingPoint); Program.archiveProgressBarStep(); progress[blockNr] = true; determineProgress(); if (Interlocked.Decrement(ref threadPoolCounter) == 0) { waitForThreadPoolEvent.Set(); } }