Многопоток и получение капчи в get запросе

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
Получаю капчу гет запросом и после отправляю в капмонстр через снипет:
Код:
//Отправка капчи из картинки
var captcha__get = project.Variables["captcha__get"].Value;
var image = System.Drawing.Image.FromFile(@captcha__get);
string base64String = String.Empty;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    byte[] imageBytes = ms.ToArray();
    base64String = Convert.ToBase64String(imageBytes);
}
var result = ZennoPoster.CaptchaRecognition("capmonster2.dll", base64String, "");
// отрезаем лишнее
var tmp = result.Split(new [] {"-|-"}, StringSplitOptions.None);
if (tmp.Length > 1) return tmp[0];
return result;
Далее пытаюсь удалить файл капчи (каждая капча хранится в отдельной рандомной папке) и пишет, что нет доступа т.к. файл используется другим процессом, это как вообще понимать? в каждом потоке папка, в которой лежит капча, имеет рандомное название. Можно конечно не удалять капчу и тогда все работает, но это тупо т.к. накапливается по 5-10к файлов, которые долго приходится вычищать. Можно ли это как-то исправить?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
вычищай с каждым запуском картинки, которым больше суток, например.
 

Ribas

Client
Регистрация
31.05.2014
Сообщения
1 440
Благодарностей
503
Баллы
113
А зачем каждую капчу в отдельную папку если не секрет?
 

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
А зачем каждую капчу в отдельную папку если не секрет?
название капчи одинаковое "sendpic.php" и если их не класть в разные папки, то сыпятся ошибки про доступ
 

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Первый вариант - прописывать дату в имени капчи. С допиской рандомной части имени.
Еще можно записывать имена капчи в список вместе с датой загрузки. Ну а при запуске соответсвенно проверять этот список и удалять в цикле капчи, в которых дата достаточно старая.
 

Tuw

Client
Регистрация
07.09.2014
Сообщения
441
Благодарностей
150
Баллы
43
В смысле долго вычищать руками? Можно обрабатывать код, который удалит все содержимое папки после выполнения

Код:
string[] filePaths = Directory.GetFiles(@"C:\");
foreach (string filePath in filePaths)
  File.Delete(filePath);
не исполняйте его в чистом виде, опасно, не забудьте прописать путь
 

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
В смысле долго вычищать руками? Можно обрабатывать код, который удалит все содержимое папки после выполнения

Код:
string[] filePaths = Directory.GetFiles(@"C:\");
foreach (string filePath in filePaths)
  File.Delete(filePath);
не исполняйте его в чистом виде, опасно, не забудьте прописать путь
а как подписать имя рандомное к капче? она же берется из гет запроса, а там имя никак не изменить
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
В месте, где ты сохраняешь капчу на комп, ты по идее и должен прописывать имя сохраненному файлу. Ну или можешь в таком случае прописывать дату не в файл а в название своих рандомных папок и удалять их соответсвенно
 

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
В месте, где ты сохраняешь капчу на комп, ты по идее и должен прописывать имя сохраненному файлу. Ну или можешь в таком случае прописывать дату не в файл а в название своих рандомных папок и удалять их соответсвенно
не не не, вот смотри как тут поставить название свое:
 

Ribas

Client
Регистрация
31.05.2014
Сообщения
1 440
Благодарностей
503
Баллы
113
так если этот экшн отрабатывает несколько раз - он сам имя файла меняет, зачем папки городить то?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
так если этот экшн отрабатывает несколько раз - он сам имя файла меняет, зачем папки городить то?
я так понимаю он не может сохранять файлы в одно и то же место с одним и тем же именем для замены ибо возникает конфликт доступа.

Как я писал выше, можно папки, которые ты городишь, создавать с именем типа 2015-12-31_random
 
Последнее редактирование:

Ribas

Client
Регистрация
31.05.2014
Сообщения
1 440
Благодарностей
503
Баллы
113
зачем создавать папки в таком случае? первый поток скачивает капчу с именем captcha.jpg, кладёт путь в переменную, второй поток в эту же папку сохранит файл уже с именем captcha(1).jpg и так же успешно распознает свою личную капчу и так далее
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
зачем создавать папки в таком случае? первый поток скачивает капчу с именем captcha.jpg, кладёт путь в переменную, второй поток в эту же папку сохранит файл уже с именем captcha(1).jpg и так же успешно распознает свою личную капчу и так далее
а как определить какой поток какую капчу сохранил?
 

Ribas

Client
Регистрация
31.05.2014
Сообщения
1 440
Благодарностей
503
Баллы
113
а как определить какой поток какую капчу сохранил?
зачем определять? в переменную кладётся путь к сохранённому файлу, сниппет работает дальше именно с ним.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
в его переменную captcha__get путь к файлу ляжет?
 

Ribas

Client
Регистрация
31.05.2014
Сообщения
1 440
Благодарностей
503
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
100% уверенность, что имя будет штамповаться новое и не будет происходить попытка замены?
 

Ribas

Client
Регистрация
31.05.2014
Сообщения
1 440
Благодарностей
503
Баллы
113

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
зачем создавать папки в таком случае? первый поток скачивает капчу с именем captcha.jpg, кладёт путь в переменную, второй поток в эту же папку сохранит файл уже с именем captcha(1).jpg и так же успешно распознает свою личную капчу и так далее
Если бы было так как ты говоришь, я бы не писал сюда и папок не создавал бы, ошибку доступа он высвечивает если капчи так сохранять, сейчас вот прям еще раз проверю, скину, что получилось
 

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Благодарностей
48
Баллы
28
Вот что получилось:

Причем, что интересно каптч столько сколько выполнений шаблона, т.е. они вроде как скачиваются, но что то мешает. Если раскидать капчи по папка отдельным и не удалять, то все норм.
UPD. До меня дошло вроде, ошибки эти из-за повторного взятия капчи(т.е. поток думает что файла нет и вторую капчу записывает именем secpic.php(2), но такое название уже есть у другого потока). Но все равно не ясно, какого хрена папки не удаляются рандомные после выполнения сниппета.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
Пишите пути к использованным каптчам в отдельный список, например) Потом по шедулеру раз в N часов можно прогонять удаление.
 
  • Спасибо
Реакции: Art4D

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)