powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Что я делаю не так?
13 сообщений из 13, страница 1 из 1
Что я делаю не так?
    #34161800
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, но - геморрой, да и велосипед изобретать не хочется...

Подскажите, пожалуйста.

Заранее спасибо.
С уважением,
Павел.
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34161856
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хороший пример есть в самом Pb
Посмотри рекурсивные функции
Я ими сделал
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34162215
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 нет.
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34162752
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я и не имел ввиду саму функцию создания директорий
Там есть сканирование директорий
Просто проверяешь, есть или нет и при надобности создаешь
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34162884
Dmitry.
3. не вижу смысла обьявления lpPathName как блоб.


:) Это я в хэлпе ПБ увидел, что LPCSTR надо объявлять как блоб... попробую без нее, спасибо

Dmitry.
Хороший пример есть в самом Pb
Посмотри рекурсивные функции


Спасибо, посмотрю)
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34163074
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так
Только это старый вариант, если найду свежее - выложу
$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
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34163164
roleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FUNCTION boolean CreateDirectoryA(ref string path, long attr) LIBRARY "kernel32.dll"

CreateDirectoryA( "C:\TempDir", 0 ) // always 0
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34163199
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если обратили внимание используется стандартная
CreateDirectory(as_target+ls_DirName)
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34164424
to spas2001
ух) спасибо, уже сделал, в копилку пойдет )
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34173762
Andrew Nagorny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для <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
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34173781
Andrew Nagorny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в догонку

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"
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34173864
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrew Nagornyдля <10 использовать FindFirstFileA...
для >=10 использовать FindFirstFileW...
Вообще, не очень понятно как это применить к исходному вопросу, но, в приведенном коде, в любом случае есть утечка ресурсов, т.к. отсутствует вызов функции FindClose(...).
...
Рейтинг: 0 / 0
Что я делаю не так?
    #34175256
Andrew Nagorny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за FindClose.
а на счет темы. да...я малость криво прочитал тему.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Что я делаю не так?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]