Страница 1 из 3

Работа с виртуальными папками и файлами

Добавлено: 16 май 2005, 11:59
Kolinus
Доброго времени суток.
Имею:
Мобильное утройство, подключенное к компьютеру с Виндовс ХР.
Это устройство отображается в виде объекта в "моем компьютере".
Через проводник виндовый могу зайти в это устройство, увидеть его ФС и так далее.
Могу залезть программно в это устройство, увидеть папки в его ФС.
Задача:
вытащить файлы из определенных папок этого устройства.
Проблема:
программно не вижу файлов и не представляю как их оттуда выдернуть.
Замечание:
для навигации по папкам использую SHGetDesktopFolder и итеративно перебираю все папки входящие в нее, спускаясь ниже.

Добавлено: 16 май 2005, 12:44
Romeo
Ты хочешь сказать, что IShellFolder::EnumObjects соотвествующего ShellFolder объекта возвращает пустой EnumIDList объект?

Добавлено: 16 май 2005, 12:49
Kolinus
Очень на то похоже, хотя я и включаю флаг ..._NONFOLDER
То есть енамобжектс возвращает нормальный ответ, а когда делаю Next, то получаю ошибку

Добавлено: 16 май 2005, 12:58
Romeo
1. Попробуй перечислить, все виртуальные айтемы: как файлы, так и папки.
2. Проверяй результат, который возвращает IShellFolder::EnumObjects.
3. Перед тем, как вызывать IEnumIDList::Next, вызови на всякий случай IEnumIDList::Reset.

Результаты исследований приведи в ответе.

Добавлено: 16 май 2005, 15:15
Kolinus
Все я их вижу - по ходу проблема была в том что они скрытые а я не указывал флаг.
Теперь вопрос- как их все-таки оттуда скопировать на локальный диск ??

Добавлено: 16 май 2005, 17:53
Romeo
Нужно спросить у ShellFolder объекта интерфейс IPersistFolder2 и вызвать IPersistFolder2::GetCurFolder. После этого конкатенировать полученный pidl папки с pidl'ом, который вернёт EnumIDList::Next. Полученный full pidl нужно загнать в SHGetPathFromIDList и получить реальный путь к файлу. После этого можно воспользоваться один из миллиона способов скопировать файл, от элементаного CopyFile до навороченного шеловского SHFileOperation.

Добавлено: 17 май 2005, 15:25
Kolinus
А как сконкатинировать данные пидлы ?

Добавлено: 17 май 2005, 15:34
Romeo
Читай MSDN (напиши в поиске "pidl copy" и открой первую же ссылку). Там даны прямо готовые функции для работы с pidl'ами. Стоит только скопировать и вставить в совй код :) .

Добавлено: 17 май 2005, 16:20
Kolinus
LPSHELLFOLDER folder - папка, содержащая файлы

IPersistFolder2 *pf;

folder->QueryInterface(IID_IPersistFolder2,(void**)&pf);
LPITEMIDLIST pidlFolder;
hr=pf->GetCurFolder(&pidlFolder);
if(SUCCEEDED(hr))
{
LPITEMIDLIST pidlNew;
UINT cb1 = GetSize(pidlFolder) - sizeof(pidlFolder->mkid.cb);
UINT cb2 = GetSize(pidlChild);
IMalloc *g_pMalloc;
SHGetMalloc(&g_pMalloc);
pidlNew = (LPITEMIDLIST)g_pMalloc->Alloc(cb1 + cb2);
if (pidlNew)
{
CopyMemory(pidlNew, pidlChild, cb1);
CopyMemory(((LPSTR)pidlNew) + cb1, pidlFolder, cb2);
}
char path[MAX_PATH];
BOOL ret;
ret=SHGetPathFromIDList(pidlNew,path);

ret - ложь то есть не возвращает имя.
в чем бага может быть ?

Добавлено: 17 май 2005, 17:56
Romeo
Возможно пути к файлу нет, он существует только в виртуально. Нужно подумать.