Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.03;
Скачать: CL | DM;

Вниз

Определение диска на котором находится файл.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
15-1198551896
Slider007
2007-12-25 06:04
2008.02.03
С днем рождения ! 25 декабря 2007 вторник


10-1142832134
Alex_C
2006-03-20 08:22
2008.02.03
Создание многопоточных приложений на COM


1-1193417311
terc
2007-10-26 20:48
2008.02.03
получения род окна зная hwnd дочернего ??


15-1198835285
Cj
2007-12-28 12:48
2008.02.03
Раздвоение анкет


15-1198590208
FLuimer
2007-12-25 16:43
2008.02.03
Ищу название фильма...