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

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

16 май 2005, 11:59

Доброго времени суток.
Имею:
Мобильное утройство, подключенное к компьютеру с Виндовс ХР.
Это устройство отображается в виде объекта в "моем компьютере".
Через проводник виндовый могу зайти в это устройство, увидеть его ФС и так далее.
Могу залезть программно в это устройство, увидеть папки в его ФС.
Задача:
вытащить файлы из определенных папок этого устройства.
Проблема:
программно не вижу файлов и не представляю как их оттуда выдернуть.
Замечание:
для навигации по папкам использую SHGetDesktopFolder и итеративно перебираю все папки входящие в нее, спускаясь ниже.
В SAD - все в SAD.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

16 май 2005, 12:44

Ты хочешь сказать, что IShellFolder::EnumObjects соотвествующего ShellFolder объекта возвращает пустой EnumIDList объект?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

16 май 2005, 12:49

Очень на то похоже, хотя я и включаю флаг ..._NONFOLDER
То есть енамобжектс возвращает нормальный ответ, а когда делаю Next, то получаю ошибку
В SAD - все в SAD.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

16 май 2005, 12:58

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

Результаты исследований приведи в ответе.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

16 май 2005, 15:15

Все я их вижу - по ходу проблема была в том что они скрытые а я не указывал флаг.
Теперь вопрос- как их все-таки оттуда скопировать на локальный диск ??
В SAD - все в SAD.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

16 май 2005, 17:53

Нужно спросить у ShellFolder объекта интерфейс IPersistFolder2 и вызвать IPersistFolder2::GetCurFolder. После этого конкатенировать полученный pidl папки с pidl'ом, который вернёт EnumIDList::Next. Полученный full pidl нужно загнать в SHGetPathFromIDList и получить реальный путь к файлу. После этого можно воспользоваться один из миллиона способов скопировать файл, от элементаного CopyFile до навороченного шеловского SHFileOperation.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

17 май 2005, 15:25

А как сконкатинировать данные пидлы ?
В SAD - все в SAD.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

17 май 2005, 15:34

Читай MSDN (напиши в поиске "pidl copy" и открой первую же ссылку). Там даны прямо готовые функции для работы с pidl'ами. Стоит только скопировать и вставить в совй код :) .
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

17 май 2005, 16:20

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 - ложь то есть не возвращает имя.
в чем бага может быть ?
В SAD - все в SAD.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

17 май 2005, 17:56

Возможно пути к файлу нет, он существует только в виртуально. Нужно подумать.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить