Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1198503629
palva
2007-12-24 16:40
2008.02.03
Теперь вопросов на Delphimaster будет меньше


2-1199977243
Nil
2008-01-10 18:00
2008.02.03
Application.ShowMainForm := False; и TFrame


2-1199963797
Smaller
2008-01-10 14:16
2008.02.03
Где отключается backup?


6-1179291582
апвып
2007-05-16 08:59
2008.02.03
компонент NMHTTP1.


2-1199972940
AntonUSAnoV
2008-01-10 16:49
2008.02.03
как открыть файл из delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский