Форум: "Начинающим";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];
ВнизОпределение диска на котором находится файл. Найти похожие ветки
← →
Riply © (2008-01-02 10:50) [0]Здравствуйте ! С Новым Годом !
Встала такая задача:
Есть большой список файловых объектов, заданных полным путем к объекту.
Мы бежим по этому списку, открываем объект, что-то делаем с ним и закрываем.
При работе с объектом нам надо знать
находиться ли он на том же диске, что и предыдущий(обработанный) объект, или нет.
Как это можно организовать ?
Первое что приходит в голову:
для каждого объекта выделять из пути имя диска,
и запрашивать для него GetVolumeNameForVolumeMountPoint.
Но это огромные накладные расходы :(
NtQueryVolumeInformationFile(..., FileFsVolumeInformation),
запоминать VolumeSerialNumber и сравнивать с предыдущим ?
Плюс - не надо для каждого объекта открывать сам диск и не трогаем MountMeneger.
Минус - (если я не ошибаюсь) нет гарантии что VolumeSerialNumber уникален для
каждого диска в тачении всего периода сессии Windows.
Подскажите, пожалуйста, как с этим справиться без открывания каждый раз
доп. объектов или свести накладные расходы к минимуму ?
← →
Sergey Masloff (2008-01-02 11:05) [1]Что-то ни фига не понял. Имеется в виду на одном физическом диске?
Ну типа диски c: и d: на одном а e: на другом?
А на фига для каждого файла что-то запрашивать?
1) выделяешь имя диска
2) запрашиваешь для него что нужно
3) запоминаешь в кеше (список, хеш-таблица, массив - без разницы) соченание имя-диск
4) переходишь к следующему файлу. Если его нет то 12)
5) выделяешь имя диска
6) смотришь есть ли в кеше сочетание. если есть то goto 7 else 9
7) Сравниваешь по кешу с предыдущим.
8) идешь на 4)
9) в кеше не было. Запрашиваешь что нужно записываешь в кеш
10) Сравниваешь с предыдущим
11) идешь на 4
12) выход ;-)
или тоже слишком медленно? По крайней мере свой GetVolumeNameForVolumeMountPoint будешь делать на 4-5 порядков реже
← →
sniknik © (2008-01-02 11:20) [2]> А на фига для каждого файла что-то запрашивать?
1-10 стринглист с сортировкой, и бежишь по нему, чтото делаешь. автоматом, кончится один диск начнется следующий.
← →
Sergey Masloff (2008-01-02 11:25) [3]sniknik © (02.01.08 11:20) [2]
ну или так. Только все же проверка так как когда кончится диск c: и начнется d: физический диск может остаться тем же. Но в любом случае в твоем варианте будет быстрее так как у меня все равно много обращений пусть и к кешу а у тебя проверок не более чем букв используемых как имена дисков
← →
Riply © (2008-01-02 11:26) [4]> [1] Sergey Masloff (02.01.08 11:05)
> Что-то ни фига не понял. Имеется в виду на одном физическом диске?
> Ну типа диски c: и d: на одном а e: на другом?
Нет. Sorry. Очень некузяво объяснила. Имелось ввиду:
например, мы обработали файл E:\Bla_Bla\Bla_1.txt,
переходим к E:\Bla_Bla\Bla_2.txt.
Надо иметь уверенность, что сейчас Е - это тот же самый диск, что и был раньше.
а не случилось так, что сначала мы работали на одном, а теперь под этой буквой другой.
← →
sniknik © (2008-01-02 11:49) [5]> а теперь под этой буквой другой.
а оно разве меняется вот так на "лету"? если в менеджере сделать смену букве, то там предупреждение будет, чтото о потерянных ссылках и необходимости перезагрузки... не сделали - сами себе злобные буратины.
← →
Riply © (2008-01-02 11:57) [6]> [5] sniknik © (02.01.08 11:49)
> а оно разве меняется вот так на "лету"?
К сожалению такая ситуация более чем реальна,
вариантов как такое могло случиться море :(
Например, мы работали на диске, его "размаунтили" и "замаунтили другой". Он вста на ту же букву.
Пока остановилась на таком решении:
Удерживаем Handle диска открытым. И при открытии нового объекта,
запрашиваем у диска NtQueryObject(..., ObjectNameInformation, ...).
Смотрим на возвращаемую ошибку, если она есть или его имя.
Но это тоже некузяво.
← →
guav © (2008-01-02 14:35) [7]> [6] Riply © (02.01.08 11:57)
> К сожалению такая ситуация более чем реальна,
> вариантов как такое могло случиться море :(
> Например, мы работали на диске, его "размаунтили" и "замаунтили
> другой". Он вста на ту же букву.
Можно подписаться на уведомления о монтировании/демонтировании.
Можно ещё открывать следующий файл до закрытия предыдущего, тогда это уже проблемы юзера, что он размонитровал диск с имеющимися открытыми хендлами.
← →
Riply © (2008-01-02 14:49) [8]> [7] guav © (02.01.08 14:35)
> Можно подписаться на уведомления о монтировании/демонтировании.
Не хотелось бы "привязыватья" к этому.
> Можно ещё открывать следующий файл до закрытия предыдущего, тогда это уже проблемы юзера,
> что он размонитровал диск с имеющимися открытыми хендлами.
А ведь верно ! Забываем про диск и держим предыдущий Handle. Как все просто :)
Правда, здесь же (на этом форуме), многие говорили, что не видят смысла
"утруждать себя безопасным извлечением флешки".
Значит, "тогда это уже проблемы юзера" может случиться у очень многих :)
← →
guav © (2008-01-02 15:03) [9]> [8] Riply © (02.01.08 14:49)
Не забывай, что тогда надо учитывать букву.
Т.е. если буква текущего и предыдущего совпадает, то номер со спихиванием ответственности на пользователя проходит, иначе - звиняйте.
<off>У тя там с почтой проблемы решились ?</off>
← →
Riply © (2008-01-02 18:00) [10]> [9] guav © (02.01.08 15:03)
> Не забывай, что тогда надо учитывать букву.
:)
> Т.е. если буква текущего и предыдущего совпадает,
> то номер со спихиванием ответственности на пользователя проходит, иначе - звиняйте.
Так и напишу с сообщении: "Что испорчена MFT - сам виноват. Нефиг было размонтировать" :)
<off>
> У тя там с почтой проблемы решились ?
Вроде да. Но установлено, что не все мои письма
дошли до адресатов, и наоборот. :(
</off>
← →
guav © (2008-01-03 19:31) [11]> Вроде да. Но установлено, что не все мои письма
> дошли до адресатов, и наоборот. :(
А вчерашнее сообщение опять не дошло ?
← →
Riply © (2008-01-03 19:41) [12]> [11] guav © (03.01.08 19:31)
> А вчерашнее сообщение опять не дошло ?
<off>
Дошло. Просто оно требовало времени на обдумывание ответа :)
</off>
← →
oldman © (2008-01-04 10:33) [13]
> Есть большой список файловых объектов, заданных полным путем
> к объекту.
Я что-то не понимаю???
← →
Riply © (2008-01-04 12:05) [14]> [13] oldman © (04.01.08 10:33)
> Я что-то не понимаю???
Обработка занимает некоторое время.
Соответственно, объекты как бы "разнесены во времени".
Если мы работали с файлом E:\Bla_Bla\Bla_1.txt во время T,
то совсем не факт, что файл E:\Bla_Bla\Bla_2.txt во время T1,
находится на том же самом диске. (Буква та же, а диск уже совсем другой).
← →
oldman © (2008-01-09 17:23) [15]Перед открытием файла проверяешь предыдущий на наличие.
← →
KilkennyCat © (2008-01-10 04:47) [16]поскольку в сабже сказано, что с файлом что-то делается, рискну предполжить, что запись на диск разрешена.
← →
Рамиль © (2008-01-10 09:56) [17]Еще надо учесть, что диск может быть примонтирован в папку (NTFS), причем как раздел на этом же диске, так и раздел на другом физическом диске.
Или это должно считаться одним диском?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.53 c