Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.64.226] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Согласен.fFile была объявлена глобально.Думаю,проблема была в этой переменной. Перенёс её в функцию и передаю как аргумент,там же выделяю память. Перепишу и протестирую. Спасибо,что проверили. Добавлено Цитата ЫукпШ @ Благодарю.Интересный подход.Обязательно попробую. |
Сообщ.
#17
,
|
|
|
Цитата Sherman @ Интересный подход Интересный подход для FAT, и в тоже время - неинтересный для NTFS. Все почему-то помнят только про файлы и каталоги, но напрочь забывают по хард-линки. А ведь так можно и улететь в бесконечный скан. |
Сообщ.
#18
,
|
|
|
Только не хард-линки, а соединения, да и то только для каталогов. Хотя для файлов тоже имеет смысл сканить, чтоб не обрабатывать дубликаты, но к ошибкам это-таки не приведёт.
P.S. Если уж заводить разговор за стратегически правильный код, то там много что учитывать надо. Нужно отсекать как минимум FILE_ATTRIBUTE_TEMPORARY и FILE_ATTRIBUTE_OFFLINE. Нужно пытаться зайти в очередной каталог и проверять успех, а то вдруг прав нет туда заглядывать, иначе тоже легко можно свалиться в бесконечный скан одного и того же каталога. И если речь о каком-то аналоге бэкапа, было бы неплохо хотя бы пробовать не обновлять время доступа к очередному файлу, чтоб не ломать статистику по частоте использования. |
Сообщ.
#19
,
|
|
|
Цитата JoeUser @ Все почему-то помнят только про файлы и каталоги, но напрочь забывают по хард-линки. Что-то вообще сложное... .Попробую изучить эту тему.Спасибо. Добавлено Есть вопрос по кол-ву потоков. Пишу программку,которая будет искать все файлы на ПК,проверяя расширение файла. Если расширение файла совпадает с тем,что я укажу,mp4 например,создаёт поток передавая функции потока строку,содержащую полный путь к файлу. Функция потока,в свою очередь,копирует найденные файлы на внешний жёсткий,который я тоже укажу. Для этого я использую функции WINAPI(CreateFile,CreateFileMapping,MapViewOfFile). Какое кол=во потоков можно использовать,для этой задачи? Пока я просто ищу файлы,передаю строки в потоки и там вывожу их в консоль. Так же вывожу целое число,которое соответствует кол-ву переданных строк в функцию потока. Но я заметил,что число файлов показывает разное,при одинаковых условиях. Чем больше потоков,тем больше разница. Пробовал от 2 до 5000 потоков.(в качестве эксперимента) На 500 потоков разнице +-10,на 5000 около 100000 строк. |
Сообщ.
#20
,
|
|
|
Цитата Qraizer @ P.S. Если уж заводить разговор за стратегически правильный код, то там много что учитывать надо. Нужно отсекать как минимум FILE_ATTRIBUTE_TEMPORARY и FILE_ATTRIBUTE_OFFLINE. я делал так: Для файлов : FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_OFFLINE Для директорий : FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_OFFLINE | FILE_ATTRIBUTE_REPARSE_POINT И конечно, проверка на ошибку "ERROR_ACCESS_DENIED". Детали я точно не помню. Но ничего страшного с запретом доступа нет. Перечислить такую директорию (убедиться в её наличии) можно, а искать файлы внутри нельзя. Произойдёт ошибка и цикл завершиться, ничего страшного. Следить за этой ошибкой полезно исключительно в информационном смысле, для выдачи сообщения, что "зайти туда было запрещено". |
Сообщ.
#21
,
|
|
|
Цитата ЫукпШ @ И конечно, проверка на ошибку "ERROR_ACCESS_DENIED". Не подскажете,как сделать эту проверку? |
Сообщ.
#22
,
|
|
|
Цитата Sherman @ Какое кол=во потоков можно использовать,для этой задачи? Цитата Sherman @ Функция потока,в свою очередь,копирует найденные файлы на внешний жёсткий,который я тоже укажу. Для этого я использую функции WINAPI(CreateFile,CreateFileMapping,MapViewOfFile). Какое кол=во потоков можно использовать,для этой задачи? Я ж тебе вроде писал, что достаточно трёх потоков. С тех пор ничего не изменилось. Не работает функция в потоке _beginthreadex (сообщение #3798301) |
Сообщ.
#23
,
|
|
|
Цитата Qraizer @ Только не хард-линки, а соединения, да и то только для каталогов. Ну я образно. Хотя ты прав недо-хардлинки Цитата Sherman @ Что-то вообще сложное... .Попробую изучить эту тему.Спасибо. Так это еще не все, не расслабляйся! Надо искать файлы, которых "в явном виде нет, а они есть". Я про NTFS-потоки, а-ля: echo file-1>file-1.txt echo secret-1>file-1.txt:secret-1.txt Файл secret-1.txt в листинге dir не виден. Но он есть, и он - в потоке файла file-1.txt, и можно убедиться: notepad file-1.txt notepad file-1.txt:secret-1.txt |
Сообщ.
#24
,
|
|
|
Цитата Олег М @ Я ж тебе вроде писал, что достаточно трёх потоков. С тех пор ничего не изменилось. Да,я помню,но с тем способом вообще беда у меня. Я даже нигде не встречах подобие того,что вы описали. Добавлено Цитата JoeUser @ |
Сообщ.
#25
,
|
|
|
Цитата Sherman @ Цитата ЫукпШ @ И конечно, проверка на ошибку "ERROR_ACCESS_DENIED". Не подскажете,как сделать эту проверку? BOOL RetC=FALSE; // ... hFind = ::FindFirstFile(pTempName, &FindFileData); if(hFind == INVALID_HANDLE_VALUE) {RetC = FALSE;} else {RetC = TRUE; } //... RetC = ::FindNextFile(...); if(RetC == FALSE) { DWORD LE = ::GetLastError(); // возможные результаты окончания if(LE == ERROR_NO_MORE_FILES) {...} // ERROR_NO_MORE_FILES = 18, больше файлов не осталось if(LE == ERROR_FILE_NOT_FOUND) {...} // ERROR_FILE_NOT_FOUND = 2, файл не найден if(LE == ERROR_PATH_NOT_FOUND) {...} // ERROR_PATH_NOT_FOUND = 3, path не найден // доступ запрещён if(LE == ERROR_ACCESS_DENIED) {...} // другое - совсем плохо } |
Сообщ.
#26
,
|
|
|
Цитата ЫукпШ @ Большое, спасибо! |
Сообщ.
#27
,
|
|
|
Цитата Sherman @ Да,я помню,но с тем способом вообще беда у меня. Я даже нигде не встречах подобие того,что вы описали. А что встречал - как на каждый чих зафигачить поток, авось система сама разберётся? Вообще - не надо решать все проблемы одновременно. Все эти хардлинки с атрибутами это вторичная проблема, не факт, что с ней столкнёшься. Основной алгоритм здесь - асинхронный поиск и копирование, у тебя он не решён. Лучше сосредоточиться на нём, а когда заработает как часы, тогда уже можно заняться и деталями. |
Сообщ.
#28
,
|
|
|
Цитата Олег М @ Все эти хардлинки с атрибутами это вторичная проблема, не факт, что с ней столкнёшься. Не правда твоя! Берем системный диск любой современной версии винды и видим сразу же в корне соединение "Users" -> "Documents and Settings": |
Сообщ.
#29
,
|
|
|
Цитата JoeUser @ Не правда твоя! Необязательно тестировать на Document and Settings. |
Сообщ.
#30
,
|
|
|
Точнее - лучше не сканить систем диск с корня, иначе сбудутся пророчества тяжёлых времён :-)
|