Файловая система - работа с файлами, дисками, флэшками...

User's plugins

Файловая система - работа с файлами, дисками, флэшками...

Postby Ilya » Sun, 20 Jul 2008, 20:40

работа с файлами, дисками, флэшками...
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Построчная обработка файла

Postby VoidVolker » Tue, 16 Dec 2008, 00:34

Построчная обработка файла
Скачать read-by-line.spf

Требования: подключенный плагин extwords.spf

?RBL-EXIT ( ? -- )
?LINE-EXIT ( ? -- )
    Условный выход из цикла
RBL-EXIT ( -- )
LINE-EXIT ( -- )
    Выйти из цикла
FOUND-LINE ( -- a u )
    Найденная строка
LINE-NUMBER ( -- n )
    Номер найденной строки (начинается с 1)

Построчное чтение файла с диска:
Code: Select all
READ-BY-LINE: "C:\path\file.txt"
    <код, который надо выполнить для каждой строки>
;READ-BY-LINE

Code: Select all
S" C:\path\file.txt" READ-BY-LINE
    <код, который надо выполнить для каждой строки>
;READ-BY-LINE

Медленно, но с минимальными затратами памяти - 10кб на строку, поддерживается только Windows переводы строк. Ограничение на длину строки - 10кб, размер файла может быть любым.

Построчная обработка файла:
Code: Select all
FOR-FILE-LINES: "C:\path\file.txt"
    <код, который надо выполнить для каждой строки>
;FOR-FILE-LINES

Code: Select all
S" C:\path\file.txt" FOR-FILE-LINES
    <код, который надо выполнить для каждой строки>
;FOR-FILE-LINES

Файл целиком загружается в память - максимально быстро. После окончания цикла память освобождается. Поддерживаются любые разделители строк. Ограничения на длину строк нет, естественное ограничение на размер файла - 2гб (ннкрон 32-х битный).

Построчная обработка строки:
Code: Select all
FOR-LINES: "any long line"
    <код, который надо выполнить для каждой подстроки>
;FOR-LINES

Code: Select all
S" any long line" FOR-LINES
    <код, который надо выполнить для каждой подстроки>
;FOR-LINES

После окончания цикла память освобождается. Поддерживаются любые разделители строк.

Разделители строк:
LE-WIN
    Установить разделителем переводы строк Windows формата 0x0D0A
LE-UNIX
    Установить разделителем переводы строк Unix формата 0x0A
LE-OSX
    Установить разделителем переводы строк OSX формата 0x0D
LE-Z
    Установить разделителем строк ноль
LE-SET ( a u -- )
    Установить собственный делитель строк
LE-GET ( -- a u )
    Получить текущий делитель строк

Изменять разделитель строк следует перед циклом. Допускается изменение разделителя строк внутри цикла, но после окончания цикла будет восстановлен исходный разделитель строк.
Last edited by Ilya on Sun, 17 May 2009, 17:55, edited 2 times in total.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Включаем/отключаем USB девайсы.

Postby Ilya » Tue, 20 Jan 2009, 19:44

Включаем/отключаем системные устройства (модем, камера, USB - устройства, ...)
File: sysdevice-on-off.f
Пользуем:
PLUG/UNPLAG-DEVICE-BY-SERVICE - вкл/откл. девайс по его назначению
Code: Select all
DICS_DISABLE S" USBSTOR" PLUG/UNPLAG-DEVICE-BY-SERVICE \ отключаем флэшку (карту памяти)


PLUG/UNPLAG-DEVICE-BY-DESC - вкл/откл. девайс по его имени
Code: Select all
DICS_ENABLE S" Acer Crystal Eye webcam" PLUG/UNPLAG-DEVICE-BY-DESC \ включаем Веб-камеру по её имени

DICS_ENABLE и DICS_DISABLE - константы соотв. вкл./выкл.

По просьбам трудящихся! :D
Добавлены слова:
1)
Code: Select all
find-device ( adr n -- f )

adr n - "Имя" девайса, вида "Шина PCI"
f - флаг TRUE - девайс найден, FALSE - нет
2) all-device-list ( xt -- ) Выводим список всех девайсов
Юзаем ~ так:
Code: Select all
: pech-dev MsgBox ;
.....
Action:
['] pech-dev all-device-list
....

3) Определяем состояние питания девайса
Code: Select all
 get-device-power-data ( adr n -- f )

Code: Select all
\ Включаем/отключаем системные устройства (модем, камера, USB - устройства, ...)
\ Aug 2008-2009
WINAPI: SetupDiEnumDeviceInfo Setupapi.dll
WINAPI: SetupDiGetClassDevsA Setupapi.dll
WINAPI: SetupDiDestroyDeviceInfoList Setupapi.dll
WINAPI: SetupDiGetDeviceRegistryPropertyA Setupapi.dll
WINAPI: SetupDiSetClassInstallParamsA Setupapi.dll
WINAPI: SetupDiCallClassInstaller Setupapi.dll
WINAPI: CM_Get_DevNode_Status Setupapi.dll

0 VALUE hDevInfo
0 VALUE dev-type
VARIABLE dev-list
VECT dev-list-action
CREATE DeviceInfoData 100 ALLOT
CREATE DeviceInfoData1 500 ALLOT
CREATE DeviceDesc 255 ALLOT

18 CONSTANT DIF_PROPERTYCHANGE
1 CONSTANT DICS_ENABLE
2 CONSTANT DICS_DISABLE
1 CONSTANT DICS_FLAG_GLOBAL
4 CONSTANT DIGCF_ALLCLASSES
2 CONSTANT DIGCF_PRESENT

0 CONSTANT SPDRP_DEVICEDESC
2 CONSTANT SPDRP_COMPATIBLEIDS
7 CONSTANT SPDRP_CLASS
8 CONSTANT SPDRP_CLASSGUID
0x16 CONSTANT SPDRP_ENUMERATOR_NAME
0x1 CONSTANT SPDRP_HARDWAREID
0x4 CONSTANT SPDRP_SERVICE
0x19 CONSTANT SPDRP_DEVTYPE
0x1E CONSTANT SPDRP_DEVICE_POWER_DATA
16 CONSTANT SPDRP_CAPABILITIES

\ =========== Структуры
0
CELL -- cbSize
CELL -- InstallFunction
CELL -- StateChange
CELL -- Scope
CELL -- HwProfile
CONSTANT /PSP_PROPCHANGE_PARAMS

CREATE PSP_PROPCHANGE_PARAMS /PSP_PROPCHANGE_PARAMS ALLOT
\ Дефолтная слово
: def-dev-list-action
2DROP
;
' def-dev-list-action TO dev-list-action
: init-psp-struct ( n -- )
PSP_PROPCHANGE_PARAMS StateChange !
DICS_FLAG_GLOBAL PSP_PROPCHANGE_PARAMS Scope !
DIF_PROPERTYCHANGE PSP_PROPCHANGE_PARAMS InstallFunction !
8 PSP_PROPCHANGE_PARAMS !
;



: _find-device
0
   BEGIN
      28 DeviceInfoData !
      DeviceInfoData OVER hDevInfo SetupDiEnumDeviceInfo
   WHILE
      HERE 500 DeviceInfoData1 HERE CELL+ dev-type \  SPDRP_DEVICEDESC \ SPDRP_SERVICE
      DeviceInfoData hDevInfo SetupDiGetDeviceRegistryPropertyA DROP
      DeviceInfoData1 ASCIIZ> DeviceDesc ASCIIZ>
      COMPARE 0=
      IF DROP TRUE EXIT THEN
      1+
   REPEAT
   DROP
   FALSE
;
\ Ищем девайс по имени
: find-device ( adr n -- f )
\ adr n - имя девайса вида "Шина PCI"
\ f - TRUE - девайс присутствует, FALSE - отсутствует
DeviceDesc ZPLACE
DICS_ENABLE init-psp-struct
DIGCF_PRESENT DIGCF_ALLCLASSES OR
0 0 0 SetupDiGetClassDevsA
DUP INVALID_HANDLE_VALUE =
IF
   ABORT" Invalid handle!"
ELSE
   TO hDevInfo
   _find-device
   hDevInfo SetupDiDestroyDeviceInfoList DROP
THEN
;
\ Определяем состояние питания девайса
: get-device-power-data ( adr n -- f )
\ adr n - имя девайса вида "Шина PCI"
\ f - перечислены ниже
\ PowerSystemUnspecified = 0
\ PowerSystemWorking     = 1,  PowerSystemSleeping1   = 2,  PowerSystemSleeping2   = 3
\ PowerSystemSleeping3   = 4,  PowerSystemHibernate   = 5,  PowerSystemShutdown    = 6
\ PowerSystemMaximum     = 7
DeviceDesc ZPLACE
DICS_ENABLE init-psp-struct
DIGCF_PRESENT DIGCF_ALLCLASSES OR
0 0 0 SetupDiGetClassDevsA
DUP INVALID_HANDLE_VALUE =
IF
   ABORT" Invalid handle!"
ELSE
   TO hDevInfo
   _find-device
   IF
      HERE 500 DeviceInfoData1 HERE CELL+ SPDRP_DEVICE_POWER_DATA
      DeviceInfoData hDevInfo SetupDiGetDeviceRegistryPropertyA DROP
      DeviceInfoData1 CELL+ @
      hDevInfo SetupDiDestroyDeviceInfoList DROP
   ELSE
      0
   THEN
THEN
;


\ Перечисляем весь список девайсов
: all-device-list ( xt -- )
\ xt - слова "обратотчика" списка девайсов
\ если xt = 0, то происходит "тупой" (с удалением данных) проход по списку девайсов
?DUP
IF
TO dev-list-action
ELSE
['] def-dev-list-action TO dev-list-action
THEN
0 S" " DeviceDesc ZPLACE
init-psp-struct
DIGCF_PRESENT DIGCF_ALLCLASSES OR
0 0 0 SetupDiGetClassDevsA
DUP INVALID_HANDLE_VALUE =
IF
   ABORT" Invalid handle!"
ELSE
   TO hDevInfo
0
   BEGIN
      28 DeviceInfoData !
      DeviceInfoData OVER hDevInfo SetupDiEnumDeviceInfo
   WHILE
      HERE 500 DeviceInfoData1 HERE CELL+ dev-type \  SPDRP_DEVICEDESC \ SPDRP_SERVICE
      DeviceInfoData hDevInfo SetupDiGetDeviceRegistryPropertyA DROP
      DeviceInfoData1 ASCIIZ> dev-list-action \ CR TYPE
      1+
   REPEAT
   DROP
hDevInfo SetupDiDestroyDeviceInfoList DROP
THEN
;

: plug/unplag-device ( n adr n -- )
DeviceDesc ZPLACE
init-psp-struct
DIGCF_PRESENT DIGCF_ALLCLASSES OR
0 0 0 SetupDiGetClassDevsA
DUP INVALID_HANDLE_VALUE =
IF
   ABORT" Invalid handle!"
ELSE
   TO hDevInfo
   _find-device
   IF
      /PSP_PROPCHANGE_PARAMS
      PSP_PROPCHANGE_PARAMS
      DeviceInfoData hDevInfo
      SetupDiSetClassInstallParamsA DROP

      DeviceInfoData hDevInfo DIF_PROPERTYCHANGE
      SetupDiCallClassInstaller DROP
   THEN
   hDevInfo SetupDiDestroyDeviceInfoList DROP
THEN
;
: PLUG/UNPLAG-DEVICE-BY-DESC ( n adr n -- )
SPDRP_DEVICEDESC TO dev-type
plug/unplag-device
;

: PLUG/UNPLAG-DEVICE-BY-SERVICE ( n adr n -- )
SPDRP_SERVICE TO dev-type
plug/unplag-device
;

Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург


Return to Plugins

Who is online

Users browsing this forum: No registered users and 0 guests

cron