|
|
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
declarations Function boolean CreateDirectory(blob lpPathName, os_security_attributes lpSecurityAttributes) ALIAS FOR CreateDirectoryA Library "kernel32.dll" структура os_security_attributes : type os_security_attributes from structure unsignedlong nlength unsignedlong lpsecuritydescriptor boolean binherithandle end type вызов в теле функции: os_security_attributes lpSecurityAttributes blob folder_to_create = Blob( newpath ) CreateDirectory(folder_to_create, lpSecurityAttributes) Билдер говорит, что "не удалось создать папку" (((( Что я делаю не так? и еще... там по ходу действия проги надо создавать папки на втором, третьем уровне вложенности от корня при том, что родителей этих папок тоже не существует еще... Например: есть корневая папка С:\qwert , и надо, чтоб в ней появилась папка C:\qwert\abc\123 . В С++ есть функция ForceDirectories, которая эту проблему решает(идет по строке пути вглубь и если очередной директории нет - создает) Можно ли заставить какую-нибудь функцию WinAPI сделать то же самое? (можно, конечно, самому ее написать, с несколькими последовательными вызовами CreateDirectory, но - геморрой, да и велосипед изобретать не хочется... Подскажите, пожалуйста. Заранее спасибо. С уважением, Павел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2006, 17:34 |
|
||
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
Хороший пример есть в самом Pb Посмотри рекурсивные функции Я ими сделал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2006, 17:45 |
|
||
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
1. Blob( newpath ) ф-я blob не записывает нулевой символ в конец блоба 2. параметр lpSecurityAttributes не используется, обьявляй как лонг и передавай 0 3. не вижу смысла обьявления lpPathName как блоб. предлагаю так: function boolean CreateDirectory(string lpPathName, long lpSecurityAttributes) ALIAS FOR CreateDirectoryA Library "kernel32.dll" в коде: CreateDirectory(ls_path, 0) ..Рекурсивного создания директорий в WinApi нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2006, 19:49 |
|
||
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
А я и не имел ввиду саму функцию создания директорий Там есть сканирование директорий Просто проверяешь, есть или нет и при надобности создаешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2006, 08:56 |
|
||
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
Dmitry. 3. не вижу смысла обьявления lpPathName как блоб. :) Это я в хэлпе ПБ увидел, что LPCSTR надо объявлять как блоб... попробую без нее, спасибо Dmitry. Хороший пример есть в самом Pb Посмотри рекурсивные функции Спасибо, посмотрю) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2006, 09:47 |
|
||
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
Примерно так Только это старый вариант, если найду свежее - выложу $PBExportHeader$of_recurse_dir_list.srf global type of_recurse_dir_list from function_object end type forward prototypes global function long of_recurse_dir_list (string as_path, long al_parent, string as_target, boolean ab_del) end prototypes global function long of_recurse_dir_list (string as_path, long al_parent, string as_target, boolean ab_del);// Рекурсивная процедура // Сканирует все поддиректории в директории //environment ge_Environment //GetEnvironment(ge_Environment ) // Integer li_NumDirectories, li_Index , li_Pos1 ,li_Pos2, li_Pos, li_Len, li_Items,ll_ind Long ll_New String ls_FileName, ls_DirName, ls_SubDirectory[], ls_Delimeter, ls_AllFiles,ls[] string ls_del // Если захотим остановить через какую-нибудь кнопку раскоментим //Do While Yield() //Loop ls_SubDirectory[]=ls[] // Проверка на останов //If ib_cancel Then Return 0 //// проверим разделитель //Choose Case ge_Environment.OSType // Case Sol2!, HPUX!, AIX! // ls_Delimeter = "/" // ls_AllFiles = "*" // Case Else ls_Delimeter = "\" ls_AllFiles = "*.*" //End Choose If Right(as_Path, 1) <> ls_Delimeter Then as_Path = as_Path + ls_Delimeter End if If Right(as_target, 1) <> ls_Delimeter Then as_target = as_target + ls_Delimeter End if // Get a listing of sub directories from the directory passed lb_file.Reset() lb_file.DirList(as_Path + ls_AllFiles, 55) // Show the current directory working on //sle_dir.text = as_Path // Get just the last directory name ie skip the path li_Pos = 1 li_Len = Len(as_Path) - 1 For li_Pos = li_Len to 1 Step -1 If Mid(as_Path, li_Pos, 1) = ls_Delimeter Then Exit Next // Insert name, level. open is to allow collapsing of the structure ls_FileName = Mid(as_Path, li_Pos + 1, (Len(as_Path) - (li_Pos + 1))) If ls_FileName = "" Then ls_FileName = as_Path End if // Insert the current directory working on into the datawindow. //ll_New = of_add_item(as_Path, ls_FileName, al_Parent) string ls_DirName_target // Keep a local copy of the lb directories only li_Items = lb_file.TotalItems() li_NumDirectories = 0 Do While li_Index <= li_Items If left(lb_file.Text(li_Index), 1) = "[" and lb_file.Text(li_Index)<>"[..]" and lb_file.Text(li_Index)<>"[.]" Then li_NumDirectories++ ll_ind = UpperBound(ls_SubDirectory)+1 ls_SubDirectory[ll_ind] = lb_file.Text(li_Index) If (ls_SubDirectory[ll_ind] <> "[..]") And (ls_SubDirectory[ll_ind] <> "[.]") Then // Убираем скобки li_Pos1 = Pos(lb_file.Text(li_Index), "[") li_Pos2 = Pos(lb_file.Text(li_Index), "]") ls_DirName = Left(lb_file.Text(li_Index), li_Pos1 - 1) + & Mid(lb_file.Text(li_Index), li_Pos1 + 1, li_Pos2 - li_Pos1 - 1) + & Right (lb_file.Text(li_Index), Len(lb_file.Text(li_Index)) - li_Pos2) // Если не удаление - создаем директории if not ab_del then CreateDirectory(as_target+ls_DirName) env.MyListDir[UpperBound(env.MyListDir)+1] = as_path+ls_DirName end if else //Удалим файлы из текущей папки ls_del = as_path+lb_file.Text(li_Index) if ab_del then fileinfolist.setfileattr( ls_del) FileDelete(ls_del) else FileMove(ls_del,as_target+lb_file.Text(li_Index)) end if End If li_Index++ Loop // Вызов следующего уровня директорий li_Index = 1 Do While li_Index <= li_NumDirectories If (ls_SubDirectory[li_Index] <> "[..]") And (ls_SubDirectory[li_Index] <> "[.]") Then ls_DirName = as_Path + ls_SubDirectory[li_Index] + ls_Delimeter // убираем кавычки li_Pos1 = Pos(ls_dirname, "[") li_Pos2 = Pos(ls_dirname, "]") ls_DirName = Left(ls_DirName, li_Pos1 - 1) + & Mid(ls_DirName, li_Pos1 + 1, li_Pos2 - li_Pos1 - 1) + & Right (ls_DirName, Len(ls_DirName) - li_Pos2) //Если удаление - то пропускаем формирование конечного имени if not ab_del then ls_DirName_target = as_target + ls_SubDirectory[li_Index] + ls_Delimeter // И из конечного пути тоже li_Pos1 = Pos(ls_DirName_target, "[") li_Pos2 = Pos(ls_DirName_target, "]") ls_DirName_target = Left(ls_DirName_target, li_Pos1 - 1) + & Mid(ls_DirName_target, li_Pos1 + 1, li_Pos2 - li_Pos1 - 1) + & Right (ls_DirName_target, Len(ls_DirName_target) - li_Pos2) end if //Рекурсивный вызов of_recurse_dir_list(ls_DirName, ll_New,ls_DirName_target,ab_del) End If li_Index++ Loop Return 1 end function ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2006, 10:41 |
|
||
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
FUNCTION boolean CreateDirectoryA(ref string path, long attr) LIBRARY "kernel32.dll" CreateDirectoryA( "C:\TempDir", 0 ) // always 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2006, 10:59 |
|
||
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
Если обратили внимание используется стандартная CreateDirectory(as_target+ls_DirName) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2006, 11:06 |
|
||
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
to spas2001 ух) спасибо, уже сделал, в копилку пойдет ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2006, 15:29 |
|
||
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
для <10 использовать FindFirstFileA... для >=10 использовать FindFirstFileW... public function integer of_getfilelist (string as_rootdirectory, string as_filemask, boolean ab_subdirectory, ref string as_filename[]);WIN32_FIND_DATAA lpFindFileData ULong lul_handle Long ll_count String ls_dirmask = '*' String ls_filename String ls_subdirectory[] Integer li_i,li_up String ls_tmp ll_count = UpperBound(as_filename) //File ls_tmp = as_rootdirectory+'\'+as_filemask lul_handle = FindFirstFileW(ls_tmp,lpFindFileData) do while lul_handle >0 if Not inv_numerical.of_GetBit(Long(lpFindFileData.dwFileAttributes),5) then ls_filename = Trim(lpFindFileData.cFileName) lpFindFileData.cFileName = '' if Len(ls_filename) > 0 then ll_count ++ if ab_subdirectory then ls_filename = as_rootdirectory+'\'+ls_filename as_filename[ll_count] = ls_filename end if end if if Not FindNextFileW(lul_handle,lpFindFileData) then EXIT loop //SubDirectory if ab_subdirectory then li_up = of_GetSubDirectories(as_rootdirectory,ls_subdirectory) For li_i = 1 to li_up of_GetFileList(as_rootdirectory + '\'+ls_subdirectory[li_i],as_filemask,ab_subdirectory,as_filename) Next end if Return UpperBound(as_filename) end function public function integer of_getsubdirectories (string as_rootdirectory, ref string as_filename[]);WIN32_FIND_DATAA lpFindFileData ULong lul_handle Long ll_count String ls_dirmask = '*' String ls_filename String ls_tmp ls_tmp = as_rootdirectory+'\'+ls_dirmask lul_handle = FindFirstFileW(ls_tmp,lpFindFileData) do while lul_handle >0 ls_filename = Trim(lpFindFileData.cFileName) lpFindFileData.cFileName = '' if Len(ls_filename) > 0 then if Not(ls_filename ='.' Or ls_filename = '..') then if inv_numerical.of_GetBit(lpFindFileData.dwFileAttributes,5) then ll_count ++ as_filename[ll_count] = ls_filename end if end if end if if Not FindNextFileW(lul_handle,lpFindFileData) then EXIT loop Return UpperBound(as_filename) end function ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2006, 10:05 |
|
||
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
в догонку type win32_find_dataa from structure unsignedlong dwfileattributes filetime ftcreationtime filetime ftlastaccesstime filetime ftlastwritetime unsignedlong nfilesizehigh unsignedlong nfilesizelow unsignedlong dwreserved0 unsignedlong dwreserved1 character cfilename[260] character calternatefilename[14] end type Function ulong FindFirstFile (string lpFileName, ref WIN32_FIND_DATAA lpFindFileData) Library "KERNEL32.DLL" Alias for "FindFirstFileA;Ansi" Function ulong FindFirstFileW (ref string lpFileName, ref WIN32_FIND_DATAA lpFindFileData) Library "KERNEL32.DLL" Alias for "FindFirstFileW" Function boolean FindNextFile (ulong hFindFile, ref WIN32_FIND_DATAA lpFindFileData) Library "KERNEL32.DLL" Alias for "FindNextFileA;Ansi" Function boolean FindNextFileW (ulong hFindFile, ref WIN32_FIND_DATAA lpFindFileData) Library "KERNEL32.DLL" Alias for "FindNextFileW" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2006, 10:12 |
|
||
|
Что я делаю не так?
|
|||
|---|---|---|---|
|
#18+
Andrew Nagornyдля <10 использовать FindFirstFileA... для >=10 использовать FindFirstFileW... Вообще, не очень понятно как это применить к исходному вопросу, но, в приведенном коде, в любом случае есть утечка ресурсов, т.к. отсутствует вызов функции FindClose(...). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2006, 10:36 |
|
||
|
|

start [/forum/topic.php?fid=15&msg=34161856&tid=1337453]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 207ms |
| total: | 355ms |

| 0 / 0 |
