Автор Тема: Баг в функции IniReadSectionNames()  (Прочитано 3576 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 854
  • Репутация: 222
  • Пол: Мужской
    • Награды
Столкнулся с неожиданным ограничением в функции IniReadSectionNames(): ограничено общее количество символов в названиях всех секций INI-файла...
Пример с короткими названиями секций (будут выведены все 5000 названий секций):
Код: AutoIt [Выделить]
; НАЧАЛО

 #Include <array.au3>
 $INI=@ScriptDir&'\test.ini'
 For $COUNTER=1 To 5000
  IniWrite($INI,$COUNTER,'par1','var1')
  IniWrite($INI,$COUNTER,'par2','var2')
  IniWrite($INI,$COUNTER,'par3','var3')
  IniWrite($INI,$COUNTER,'par4','var4')
  IniWrite($INI,$COUNTER,'par5','var5')
  IniWrite($INI,$COUNTER,'par6','var6')
 Next
 $A=IniReadSectionNames($INI)
 _ArrayDisplay($A)

; КОНЕЦ
 

Пример с длинными названиями секций (будут выведены 1365 названий секций):
Код: AutoIt [Выделить]
; НАЧАЛО

 #Include <array.au3>
 $INI=@ScriptDir&'\test.ini'
 For $COUNTER=1 To 5000
  $MOMENT=@YEAR&'-'&@MON&'-'&@MDAY&'-'&@HOUR&'-'&@MIN&'-'&@SEC&'-'&@MSEC
  IniWrite($INI,$MOMENT,'par1','var1')
  IniWrite($INI,$MOMENT,'par2','var2')
  IniWrite($INI,$MOMENT,'par3','var3')
  IniWrite($INI,$MOMENT,'par4','var4')
  IniWrite($INI,$MOMENT,'par5','var5')
  IniWrite($INI,$MOMENT,'par6','var6')
 Next
 $A=IniReadSectionNames($INI)
 _ArrayDisplay($A)

; КОНЕЦ
 

Хотя в INI-файле будут созданы все 5000 секций в обоих примерах...
Как относиться к данному ограничению: как к багу?
Главное в жизни человека - это отношение...

Русское сообщество AutoIt

Баг в функции IniReadSectionNames()
« Отправлен: Май 16, 2014, 10:05:38 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Баг в функции IniReadSectionNames()
« Ответ #1, Отправлен: Май 16, 2014, 11:04:51 »
snoitaleR  [?]
Цитировать
Как относиться к данному ограничению: как к багу?
Ограничение (баг?) есть, только, к сожалению, о нем нет информации (или я ее не нашел). Попробуйте использовать библиотеки IniVirtual, IniVirtualSPE или IniString. Примеры есть в русской справке.

Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 854

  • Автор темы
  • Репутация: 222
  • Пол: Мужской
    • Награды
Re: Баг в функции IniReadSectionNames()
« Ответ #2, Отправлен: Май 16, 2014, 11:24:58 »
madmasles
Я надеялся, что никогда не достигну технических ограничений в INI-файлах  :) ...
Пока эту ошибку исправят (если исправят), пройдёт много времени...
Я выбираю в данный момент между переходом на базы данных (SQLite) и написанием самодельной функции IniReadSectionNames()...
Пока ещё не определился...

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Баг в функции IniReadSectionNames()
« Ответ #3, Отправлен: Май 16, 2014, 11:43:47 »
snoitaleR  [?]
Цитировать
или написанием самодельной функции IniReadSectionNames()...
Можно, например, примерно так сделать.
Код: AutoIt [Выделить]
#include <Array.au3>

$sINI = @ScriptDir & '\test.ini'
$aSectionNames = StringRegExp('[nothing]' & @CRLF & FileRead($sINI), '(?m)^\h*\[(.+)\]', 3)
$aSectionNames[0] = UBound($aSectionNames) - 1
_ArrayDisplay($aSectionNames)

PS
Не знаю, баг это или нет, но, если создать в ини-файле пустую секцию ([]), то штатная IniReadSectionNames возвращает пустую строку в массиве.
« Последнее редактирование: Май 16, 2014, 15:08:00 от madmasles »

Русское сообщество AutoIt

Re: Баг в функции IniReadSectionNames()
« Ответ #3 Отправлен: Май 16, 2014, 11:43:47 »

Оффлайн snoitaleR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 854

  • Автор темы
  • Репутация: 222
  • Пол: Мужской
    • Награды
Re: Баг в функции IniReadSectionNames()
« Ответ #4, Отправлен: Май 16, 2014, 12:26:24 »
madmasles
Спасибо... На данный момент это и есть решение проблемы... Все остальные INI-функции работают нормально...
Тему закрывать не буду, пока не узнаем официальный ответ от разработчиков...

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7814
  • Репутация: 2282
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Баг в функции IniReadSectionNames()
« Ответ #5, Отправлен: Май 16, 2014, 13:47:10 »
madmasles  [?]
Цитировать
Ограничение (баг?) есть, только, к сожалению, о нем нет информации
В справке написано:
Цитировать
Только первые 32767 символов раздела принимаются во внимания для совместимости с Win9x.
Хотя в реальности конечно это чуть меньше, по моим тестам, это 31399 символов (на общую длину имён секции).

snoitaleR  [?]
Цитировать
Хотя в INI-файле будут созданы все 5000 секций в обоих примерах...
У меня кстати во втором примере не выводит все секции в файл...
Возможно связано со скоростью работы процессора, происходит две или более записей в одну миллисекунду :).
« Последнее редактирование: Май 16, 2014, 13:54:04 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7814
  • Репутация: 2282
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Баг в функции IniReadSectionNames()
« Ответ #6, Отправлен: Май 16, 2014, 13:55:04 »
Я кстати использую такую функцию:

Код: AutoIt [Выделить]
Func _IniReadSectionNamesEx($sIniFile)
    Local $aFileReadArr = StringSplit(StringStripCR(FileRead($sIniFile)), @LF)
    If @error Then Return SetError(1, 0, "")
   
    Local $aRetArr[$aFileReadArr[0]+1], $iUbound, $iSplitPos, $sKey, $sValue
   
    For $i = 1 To $aFileReadArr[0]
        If StringRegExp($aFileReadArr[$i], '^\s*\[.+\]') Then
            $aRetArr[0] += 1
            $aRetArr[$aRetArr[0]] = StringRegExpReplace($aFileReadArr[$i], '^\s*\[(.+)\].*', '\1')
        EndIf
    Next
   
    ReDim $aRetArr[$aRetArr[0]+1]
    Return $aRetArr
EndFunc


Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Баг в функции IniReadSectionNames()
« Ответ #7, Отправлен: Май 16, 2014, 14:58:13 »
CreatoR  [?]
Цитировать
В справке написано...
В английской только, в русской этого нет.

Русское сообщество AutoIt

Re: Баг в функции IniReadSectionNames()
« Ответ #7 Отправлен: Май 16, 2014, 14:58:13 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7814
  • Репутация: 2282
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Баг в функции IniReadSectionNames()
« Ответ #8, Отправлен: Май 16, 2014, 19:20:45 »
madmasles  [?]
Цитировать
В английской только, в русской этого нет.
Есть вроде.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Баг в функции IniReadSectionNames()
« Ответ #9, Отправлен: Май 16, 2014, 19:40:14 »
CreatoR,


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7814
  • Репутация: 2282
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Баг в функции IniReadSectionNames()
« Ответ #10, Отправлен: Май 16, 2014, 20:09:06 »
Нажмите для отображения изображения в оригинальном размере.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Баг в функции IniReadSectionNames()
« Ответ #11, Отправлен: Май 16, 2014, 21:06:09 »
CreatoR,
Специально перекачал архив (Развитие русской справки), нет в ней этого.

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3654
  • Репутация: 968
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Баг в функции IniReadSectionNames()
« Ответ #12, Отправлен: Май 16, 2014, 22:08:49 »
OffTopicВерсия 3.3.10.0 уже даже W2k не поддерживает
Цитировать
•Changed: Removed Windows 2000 support. Minimum supported OS is now Windows XP RTM / Windows Server 2003.
А данная проблема и в ней присутствует. Забыли снять ограничение, что ли?

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7814
  • Репутация: 2282
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Баг в функции IniReadSectionNames()
« Ответ #13, Отправлен: Май 17, 2014, 10:03:14 »
madmasles  [?]
Цитировать
Специально перекачал архив (Развитие русской справки), нет в ней этого.
Я же указал ссылку, онлайн справка, там оно есть.

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2712
  • Репутация: 1137
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: Баг в функции IniReadSectionNames()
« Ответ #14, Отправлен: Май 17, 2014, 23:18:42 »
Верну ограничение. Изначально по именам даже не представлялось реальным иметь ограничение, только по размеру секции в основном были, там и оставлено. Видимо единица буфера для возврата любых данных связанных с ini установлен с ограничением. А тем более 32767 ни как не воспринимался с ограничением суммы имён, скорее к одному имени, а тут для суммы оказалось. И кстати формулировка на скрине не верна. Теперь можно более правильно указать - "Число возвращаемых имён ограничивается суммой длин всех имён не более 32767 символов.".


CreatoR  [?]
Цитировать
Хотя в реальности конечно это чуть меньше, по моим тестам, это 31399 символов (на общую длину имён секции).
Попробовал разные длины имён, получилось ограничение зависит от количества секций (28080 - 31200), видимо разделитель для разделения имён учитывается как символ и при большем числе секций большее число разделителей и занимает большее места оставляя меньше на для секций.

snoitaleR
Ещё есть IniEx (DXRW4E)
« Последнее редактирование: Май 17, 2014, 23:28:28 от AZJIO »

Русское сообщество AutoIt

Re: Баг в функции IniReadSectionNames()
« Ответ #14 Отправлен: Май 17, 2014, 23:18:42 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
5022 Просмотров
Последний ответ Апрель 07, 2010, 15:00:35
от SyDr
9 Ответов
7356 Просмотров
Последний ответ Март 31, 2011, 09:11:41
от Suppir
2 Ответов
3039 Просмотров
Последний ответ Май 02, 2011, 16:31:01
от SET777
4 Ответов
2680 Просмотров
Последний ответ Октябрь 23, 2011, 16:13:57
от Belfigor
5 Ответов
3090 Просмотров
Последний ответ Март 23, 2012, 18:45:01
от sngr
7 Ответов
4086 Просмотров
Последний ответ Июль 07, 2012, 22:14:40
от Medic84
6 Ответов
3265 Просмотров
Последний ответ Апрель 08, 2013, 09:34:08
от madmasles
6 Ответов
1582 Просмотров
Последний ответ Февраль 27, 2014, 19:08:02
от kolosov
0 Ответов
391 Просмотров
Последний ответ Ноябрь 30, 2014, 16:44:21
от max1300
4 Ответов
1082 Просмотров
Последний ответ Март 13, 2015, 00:49:29
от And