#powerbuilder
#powerbuilder
Вопрос:
Я новичок в Powerbuilder, и здесь у меня возник вопрос о том, как определить, сколько строк данных содержится в текстовом файле. Сначала я попробовал подход с длиной файла, но не смог понять, как это сделать с моей текущей логикой. Не удалось найти ни одного примера того, как это сделать с ним, так что здесь мне нужна помощь!
Что я делаю, так это генерирую пароль из текстового файла.
Примечания: gsa_wordlist является глобальной переменной.
Также, если вы, как опытный разработчик, видите какие-либо распространенные ошибки, пожалуйста, сообщите.
Мой код при нажатии ():
int li_rand
int li_upperboundList
int li_FileNum
string ls_fileurl
string ls_listout
int i
li_upperboundList = Upperbound(gsa_wordlist)
ls_fileurl = 'C:UsersabgDocumentswordlist.txt'
IF li_upperboundList < 100 THEN
Beep(1)
li_FileNum = FileOpen(ls_fileurl)
FOR i = 1 TO // TO HOW MANY LINES OF DATA
FileReadEx(li_FileNum, ls_listout)
gsa_wordlist[i] = ls_listout
NEXT
li_upperboundList = Upperbound(gsa_wordlist)
li_rand = rand(li_upperboundList)
sle_genpass.Text = string(li_rand)
ELSE
Beep(2)
li_rand = rand(li_upperboundList)
sle_genpass.Text = gsa_wordlist[li_rand]
END IF
Ответ №1:
Вам не нужно знать, сколько строк, просто выполняйте цикл до EOF.
li_FileNum=FileOpen(ls_fileurl,LineMode!,Read!,LockRead!)
i = 1
DO While FileReadEx(li_FileNum,ls_listout) <> -100
gsa_wordlist[i ] = ls_listout
LOOP
FileClose(li_FileNum)
PS. Добавьте проверку внутри цикла на li_upperboundList
ограничение!
Комментарии:
1. Почему эта строка
1=1
?2. Нет
1=1
, этоi=1
3. Хо, извини, мне придется сменить очки. Кстати, это показывает, как легко можно контролировать проблему, даже перечитывая один и тот же код тысячу раз.
Ответ №2:
Можете ли вы назвать какую-либо причину не использовать хранилище данных?
Было бы легко импортировать слова в хранилище данных, и тогда у вас были бы немедленно доступны методы поиска, сортировки, вставки, удаления. ImportFile также намного быстрее, чем ReadFile.
Для начала создайте datawindow с внешним источником данных с именем d_dictionary со столбцом, который может вместить ваши данные.
Затем объявите глобальную переменную
datastore gds_dictionary
Пример кода
long ll_rows
string ls_fileurl = 'C:UsersabgDocumentswordlist.txt'
if not isvalid( gds_dictionary ) then
gds_dictionary = create datastore
gds_dictionary.dataobject = "d_dictionary"
end if
gds_dictionary.reset( )
ll_rows = gds_dictionary.ImportFile( ls_fileurl )
if ll_rows < 1 then
//oops! Something bad happened
else
gds_dictionary.sort( )
end if
Ответ №3:
Генерировать пароль из текстового файла таким образом — довольно плохая идея. фактически вы полагаетесь на символы при генерации пароля и никогда не выбираете полные слова из файла. Файл, содержащий много слов, используется при повторном восстановлении забытого пароля. Также слово, которое имеет смысл, если используется в качестве пароля, обязательно является слабым паролем.
Если у вас появится возможность просмотреть панель управления некоторых поставщиков услуг веб-хостинга, то вы можете найти там хороший пример сгенерированного надежного пароля (не все поставщики веб-хостинга предоставляют это).
Но очень легко создать программу, которая делает то же самое. например, следующий скрипт PowerBuilder делает свое дело.
Integer MaxLength = 10, TheNextCode
Integer ASCII_Range[33 TO 125]
String ThePass
DO While Len(ThePass) < MaxLength
TheNextCode = Rand(125)
IF TheNextCode < 33 THEN Continue
ThePass = String(Char(TheNextCode))
LOOP
mle.Text = ThePass "~r~n"