Работа с файлами и папками с помощью Win32 API
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Работа с файлами и папками с помощью 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: как с помощью полученной строки узнать имя каждого файла, что в ней находится и его путь(не ярлыка, а реальный путь) Очень срочно!!! Пожалуйста, помогите!
|
|
|
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-16 07:11:21.770000
|
|
|
Alaget
Сообщений: 330
Оценки: 0
Присоединился: 2007-11-08 15:57:53.170000
|
Вначале нужно получить, пути специальных папок.
[color=#000000]{
Константы [/color]
[color=#000000] CSIDL_DESKTOP
CSIDL_INTERNET
CSIDL_PROGRAMS
CSIDL_CONTROLS
CSIDL_PRINTERS
CSIDL_PERSONAL
CSIDL_FAVORITES
CSIDL_STARTUP
CSIDL_RECENT
CSIDL_SENDTO
CSIDL_BITBUCKET
CSIDL_STARTMENU
CSIDL_DESKTOPDIRECTORY
CSIDL_DRIVES
CSIDL_NETWORK
CSIDL_NETHOOD
CSIDL_FONTS
CSIDL_TEMPLATES
CSIDL_COMMON_STARTMENU
CSIDL_COMMON_PROGRAMS
CSIDL_COMMON_STARTUP
CSIDL_COMMON_DESKTOPDIRECTORY
CSIDL_APPDATA
CSIDL_PRINTHOOD
CSIDL_ALTSTARTUP
CSIDL_COMMON_ALTSTARTUP
CSIDL_COMMON_FAVORITES
CSIDL_INTERNET_CACHE
CSIDL_COOKIES
CSIDL_HISTORY
} [/color]
[color=#000000]uses
ActiveX, ShlObj; [/color]
[color=#000000]procedure TForm1.Button1Click(Sender: TObject);
var
Allocator: IMalloc;
SpecialDir: PItemIdList;
FBuf: array[0..MAX_PATH] of Char;
PerDir: string;
begin
if SHGetMalloc(Allocator) = NOERROR then
begin
SHGetSpecialFolderLocation(Form1.Handle, CSIDL_HISTORY, SpecialDir);
SHGetPathFromIDList(SpecialDir, @FBuf[0]);
Allocator.Free(SpecialDir);
ShowMessage(string(FBuf));
end;
end; [/color]
[color=#000000]function GetDeskTopPath : string;
var
shellMalloc: IMalloc;
ppidl: PItemIdList;
PerDir: string;
begin
ppidl := nil;
try
if SHGetMalloc(shellMalloc) = NOERROR then
begin
SHGetSpecialFolderLocation(Form1.Handle, CSIDL_DESKTOP, ppidl);
SetLength(Result, MAX_PATH);
if not SHGetPathFromIDList(ppidl, PChar(Result)) then
raise exception.create('SHGetPathFromIDList failed : invalid pidl');
SetLength(Result, lStrLen(PChar(Result)));
end;
finally
if ppidl <> nil then
shellMalloc.free(ppidl);
end;
end;[/color]
Потом узнать имя файла из ярлыка.
function NameFromLink(const lnk: string): string;
var
MyObject: IUnknown;
MySLink: IShellLink;
MyPFile: IPersistFile;
c: PChar;
pfd: _WIN32_FIND_DATAA;
begin
Result := '';
try
MyObject := CreateComObject(CLSID_ShellLink);
MySLink := MyObject as IShellLink;
MyPFile := MyObject as IPersistFile;
if MyPFile.Load(Pointer(WideString(lnk)), OF_READ) <> S_OK then
exit;
c := PChar(lnk);
MySLink.GetPath(c, MAX_PATH, pfd, 0);
Result := string(c);
except
end;
end;
Только это ShellApi, а не WinApi. На WinApi это сделать нельзя. Надеюсь, и верю что ты умеешь искать файлы в папке.
|
|
|
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 , там прямо в начале приведена функция по поиску файлов в указанном каталоге. Какое расширение задаш то и будет найдено, если все надо искать то ставишь *. :)
|
|
|
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-16 12:02:02.956666
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
quote:
На WinApi это сделать нельзя. Чушь, на WinApi можно сделать практически все
|
|
|
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
HANDLE hSearch; // результат выполнения операции с файлами
BOOL fFinished=FALSE; // собственно да или нет
WIN32_FIND_DATAA wFileNameSource; // это структура
hSearch=FindFirstFile(cPathSourse,&wFileNameSource);
if(hSearch==INVALID_HANDLE_VALUE) // файл не найден
{
m_grid.InsertItem(0,"Nothing"); // отображаем процесс работы
FindClose(hSearch); // прекращаем поиск
}
else
{
while(!fFinished)
{ // сканируем каталог пока есть файлы
if((wFileNameSource.cFileName != ".") && (wFileNameSource.cFileName != ".."))
m_grid.InsertItem(0,wFileNameSource.cFileName);
if(!FindNextFile(hSearch, &wFileNameSource))
{
if(GetLastError()== ERROR_NO_MORE_FILES) // если файлов больше нет
fFinished=TRUE; // формируем сигнал
}
}
FindClose(hSearch); // прекращаем поиск
}
}
выдает мне тупо: Автозагрузка
|
|
|
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,&wFileNameSource);
так работает! И все же, как извлечь информацию из ярлыка с помощью Win32 API?????
|
|
|
RE: Работа с файлами и папками с помощью Win32 API - 2008-02-16 17:59:43.206666
|
|
|
Ясkи
Сообщений: 204
Оценки: 0
Присоединился: 2008-02-12 22:56:17.683333
|
И все же, как извлечь информацию из ярлыка с помощью Win32 API????? Геморно очень, майкрософт рекомендует способ, который уже дали
|
|
|
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.
|
|
|
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 …
|
|
|
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.
|
|
|
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%, но не прокатывает. Возможно есть какая-то функция которая дает возможность получить переменные окружения, но я пока до этого еще не дошел :).
|
|
|
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
|
|
|
|
|