Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Работа с файлами и папками с помощью Win32 API

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Работа с файлами и папками с помощью Win32 API
Имя
Сообщение << Старые топики   Новые топики >>
Работа с файлами и папками с помощью Win32 API - 2008-02-16 00:33:28.033333   
n1ckless

Сообщений: 9
Оценки: 0
Присоединился: 2008-02-13 19:07:53.863333
Доброго времени суток!
проблема №1:
как сформировать строку следующего вида
C:\Documents and Settings\Admin\Главное меню\Программы\Автозагрузка в этой папке хранятся записи автозагрузки (ярлыки и прочее)

проблема №2:
как с помощью полученной строки узнать имя каждого файла, что в ней находится и его путь(не ярлыка, а реальный путь)

Очень срочно!!! Пожалуйста, помогите!
Post #: 1
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-16 07:11:21.770000   
Alaget

Сообщений: 330
Оценки: 0
Присоединился: 2007-11-08 15:57:53.170000
Вначале нужно получить, пути специальных папок.
[color=#000000]{ &nbsp; Константы [/color] [color=#000000]&nbsp; CSIDL_DESKTOP &nbsp; CSIDL_INTERNET &nbsp; CSIDL_PROGRAMS &nbsp; CSIDL_CONTROLS &nbsp; CSIDL_PRINTERS &nbsp; CSIDL_PERSONAL &nbsp; CSIDL_FAVORITES &nbsp; CSIDL_STARTUP &nbsp; CSIDL_RECENT &nbsp; CSIDL_SENDTO &nbsp; CSIDL_BITBUCKET &nbsp; CSIDL_STARTMENU &nbsp; CSIDL_DESKTOPDIRECTORY &nbsp; CSIDL_DRIVES &nbsp; CSIDL_NETWORK &nbsp; CSIDL_NETHOOD &nbsp; CSIDL_FONTS &nbsp; CSIDL_TEMPLATES &nbsp; CSIDL_COMMON_STARTMENU &nbsp; CSIDL_COMMON_PROGRAMS &nbsp; CSIDL_COMMON_STARTUP &nbsp; CSIDL_COMMON_DESKTOPDIRECTORY &nbsp; CSIDL_APPDATA &nbsp; CSIDL_PRINTHOOD &nbsp; CSIDL_ALTSTARTUP &nbsp; CSIDL_COMMON_ALTSTARTUP &nbsp; CSIDL_COMMON_FAVORITES &nbsp; CSIDL_INTERNET_CACHE &nbsp; CSIDL_COOKIES &nbsp; CSIDL_HISTORY } [/color] [color=#000000]uses &nbsp; ActiveX, ShlObj; [/color] [color=#000000]procedure TForm1.Button1Click(Sender: TObject); var &nbsp; Allocator: IMalloc; &nbsp; SpecialDir: PItemIdList; &nbsp; FBuf: array[0..MAX_PATH] of Char; &nbsp; PerDir: string; begin &nbsp; if SHGetMalloc(Allocator) = NOERROR then &nbsp; begin &nbsp;&nbsp;&nbsp; SHGetSpecialFolderLocation(Form1.Handle, CSIDL_HISTORY, SpecialDir); &nbsp;&nbsp;&nbsp; SHGetPathFromIDList(SpecialDir, @FBuf[0]); &nbsp;&nbsp;&nbsp; Allocator.Free(SpecialDir); &nbsp;&nbsp;&nbsp; ShowMessage(string(FBuf)); &nbsp; end; end; [/color] [color=#000000]function GetDeskTopPath : string; var &nbsp; shellMalloc: IMalloc; &nbsp; ppidl: PItemIdList; &nbsp; PerDir: string; begin &nbsp; ppidl := nil; &nbsp; try &nbsp;&nbsp;&nbsp; if SHGetMalloc(shellMalloc) = NOERROR then &nbsp;&nbsp;&nbsp; begin &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHGetSpecialFolderLocation(Form1.Handle, CSIDL_DESKTOP, ppidl); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetLength(Result, MAX_PATH); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not SHGetPathFromIDList(ppidl, PChar(Result)) then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise exception.create('SHGetPathFromIDList failed : invalid pidl'); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetLength(Result, lStrLen(PChar(Result))); &nbsp;&nbsp;&nbsp; end; &nbsp; finally &nbsp;&nbsp; if ppidl &lt;&gt; nil then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shellMalloc.free(ppidl); &nbsp; end; end;[/color] Потом узнать имя файла из ярлыка.
function NameFromLink(const lnk: string): string; var &nbsp; MyObject: IUnknown; &nbsp; MySLink: IShellLink; &nbsp; MyPFile: IPersistFile; &nbsp; c: PChar; &nbsp; pfd: _WIN32_FIND_DATAA; begin &nbsp; Result := ''; &nbsp; try &nbsp;&nbsp;&nbsp; MyObject := CreateComObject(CLSID_ShellLink); &nbsp;&nbsp;&nbsp; MySLink := MyObject as IShellLink; &nbsp;&nbsp;&nbsp; MyPFile := MyObject as IPersistFile; &nbsp;&nbsp;&nbsp; if MyPFile.Load(Pointer(WideString(lnk)), OF_READ) &lt;&gt; S_OK then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit; &nbsp;&nbsp;&nbsp; c := PChar(lnk); &nbsp;&nbsp;&nbsp; MySLink.GetPath(c, MAX_PATH, pfd, 0); &nbsp;&nbsp;&nbsp; Result := string(c); &nbsp; except &nbsp; end; end; Только это ShellApi, а не WinApi.
На WinApi это сделать нельзя. 
Надеюсь, и верю что ты умеешь искать файлы в папке. 
Post #: 2
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-16 07:17:41.926666   
user545

Сообщений: 167
Оценки: 0
Присоединился: 2006-06-24 05:21:54
Смотри мой топик - http://forum.xakep.ru/m_1071682/tm.htm , там прямо в начале приведена функция по поиску файлов в указанном каталоге. Какое расширение задаш то и будет найдено, если все надо искать то ставишь *. :)
Post #: 3
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-16 12:02:02.956666   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
quote:

На WinApi это сделать нельзя.

Чушь, на WinApi можно сделать практически все
Post #: 4
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-16 15:44:29.016666   
n1ckless

Сообщений: 9
Оценки: 0
Присоединился: 2008-02-13 19:07:53.863333
чето не получается(((
вот код:
....... //szShortcut - строка C:\Documents and Settings\Admin\Главное меню\Программы\Автозагрузка FindMyFiles("*.*",szShortcut); ........ void CMyDlg::FindMyFiles(char *cExstension, char* cPathSourse) { // m_grid это CListCtrl &nbsp;&nbsp;&nbsp; HANDLE hSearch; // результат выполнения операции с файлами &nbsp;&nbsp;&nbsp; BOOL fFinished=FALSE; //&nbsp; собственно да или нет &nbsp;&nbsp;&nbsp; WIN32_FIND_DATAA wFileNameSource; // это структура &nbsp; &nbsp;&nbsp;&nbsp; hSearch=FindFirstFile(cPathSourse,&amp;wFileNameSource); &nbsp;&nbsp;&nbsp; if(hSearch==INVALID_HANDLE_VALUE) // файл не найден &nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_grid.InsertItem(0,"Nothing"); // отображаем процесс работы &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FindClose(hSearch); // прекращаем поиск &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; else &nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(!fFinished) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; // сканируем каталог пока есть файлы &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((wFileNameSource.cFileName != ".") &amp;&amp; (wFileNameSource.cFileName != "..")) &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_grid.InsertItem(0,wFileNameSource.cFileName); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!FindNextFile(hSearch, &amp;wFileNameSource)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(GetLastError()== ERROR_NO_MORE_FILES)&nbsp; // если файлов больше нет &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fFinished=TRUE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // формируем сигнал &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FindClose(hSearch); // прекращаем поиск &nbsp;&nbsp;&nbsp; } }
выдает мне тупо: Автозагрузка
Post #: 5
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-16 16:54:48.363333   
n1ckless

Сообщений: 9
Оценки: 0
Присоединился: 2008-02-13 19:07:53.863333
ааааааа я тупонул
маску поиска не применил
char cSearchPath[MAX_PATH] strcpy(cSearchPath,cPathSourse); strcat(cSearchPath,"\\"); strcat(cSearchPath,cExstension); hSearch=FindFirstFile(cSearchPath,&amp;wFileNameSource); так работает!

И все же, как извлечь информацию из ярлыка с помощью Win32 API?????
Post #: 6
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-16 17:59:43.206666   
Ясkи

Сообщений: 204
Оценки: 0
Присоединился: 2008-02-12 22:56:17.683333
И все же, как извлечь информацию из ярлыка с помощью Win32 API?????

Геморно очень, майкрософт рекомендует способ, который уже дали
Post #: 7
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-16 20:12:15.300000   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
quote:

ORIGINAL: n1ckless
И все же, как извлечь информацию из ярлыка с помощью Win32 API?????

Никак, *.lnk файл это хронологически первый внутренний формат файлов виндовс, на который Майкрософт не дала описания. C ними можно работать только через COM.
Post #: 8
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-16 21:05:24.316666   
blаcksun

Сообщений: 1670
Оценки: 0
Присоединился: 2007-11-19 20:03:45.703333
.url - это ini файл, с ним у тя проблем не будет)

из .lnk можно получить путь следуюшим образом:
- получаем метку диска
- открываем линк на чтение
- ишем в нем метку диска - это будет начало пути до файла
- затем от начала пути ишем символы  . \ - это конец пути

Тобишь допустим есть
- Файл D:\abccba\abc\myfile.xyz
- метка диска SYSTEM (D)

Кусок строки из ссылки
SYSTEM (D) D:\abccba\abc\myfile.xyz . \

В HEX:
53595354454D2028442900443A5C6162636362615C6162635C6D7966696C652E78797A00000C002E005C

Post #: 9
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-17 23:35:49.150000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
quote:

ORIGINAL: n1ckless

Доброго времени суток!
проблема №1:
как сформировать строку следующего вида
C:\Documents and Settings\Admin\Главное меню\Программы\Автозагрузка в этой папке хранятся записи автозагрузки (ярлыки и прочее)


Есть же переменные окружения типа %windir%. Только вот точно не помню, какая именно на Docs and settings.
Post #: 10
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-18 03:05:42.713333   
user545

Сообщений: 167
Оценки: 0
Присоединился: 2006-06-24 05:21:54
Основные переменные операционной системы:
ALLUSERSPROFILE =C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\пользователь\Application Data
COMMANDER_DRIVE=C:
CommonProgramFiles=C:\Program Files\Common Files
ComSpec=C:\WINDOWS\system32\cmd.exe
HOMEDRIVE=C:
HOMEPATH=\Documents and Settings\профиль пользователя
ProgramFiles=C:\Program Files
SystemDrive=C:
SystemRoot=C:\WINDOWS
TEMP=C:\Temp
TMP=C:\Temp
USERNAME=имя пользователя
USERPROFILE=C:\Documents and Settings\профиль пользователя
windir=C:\WINDOWS
Вот только как их использовать, я пробовал ставить % windir%, но не прокатывает. Возможно есть какая-то функция которая дает возможность получить переменные окружения, но я пока до этого еще не дошел :).
Post #: 11
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-18 14:01:25.583333   
FLIER

Сообщений: 628
Оценки: 0
Присоединился: 2007-08-29 01:31:15.400000
quote:

ORIGINAL: user545
я пробовал ставить % windir%, но не прокатывает. Возможно есть какая-то функция которая дает возможность получить переменные окружения, но я пока до этого еще не дошел :).

 
как найти директория TEMP:
 
function c_GetTempPath: String
var 
  Buffer: array[0..1023] of Char; 
begin 
  SetString(Result, Buffer, GetTempPath(Sizeof(Buffer)-1,Buffer)); 
end

этот код так же можно использовать для:
GetCurrentDirectory 
GetSystemDirectory 
GetWindowsDirectory 
Post #: 12
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Работа с файлами и папками с помощью Win32 API







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.