PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как найти символы в тексте?


Как найти символы в тексте?

Сообщений 1 страница 30 из 51

1

Подскажите пожалуйста.
В цикле
1. Проверить существования файла "text.txt"
2. Если файл существует открыть его для чтения
3. Искать во всех строках файла символы (3001)
4. Закрыть файл
5. Если символы в файле найдены, запустиnь файл "file.exe"
6. Подождать 5 минут,повторить снова
           Конец цикла
Я так понимаю для начала нужно выделить память под файл.

Код:
If ReadFile(0, "text.txt") ; Открытие файла 
 Size = Lof(0) ; Определение размера файла в байтах 
 *MemoryID=AllocateMemory(Size) ; Запрашиваем у ОС число байт, равное размеру файла 
 If *MemoryID 
 ReadData(0, *MemoryID, Size) ; Копирование данных из файла в память 
 CloseFile(0) ; Закрытие файла 

 FreeMemory(*MemoryID) ; Освобождаем память

Что дальше делать не имею представления.  Может с помощью связанных списов?
Помогите пожалуйста.

Отредактировано Artur (26.01.2014 20:19:06)

0

2

Нужно из файла, данные поместить в строковую переменную. Тут пример (данные помещаются в переменную Text.s) http://pure-basic.narod.ru/docs/memory.html
Дальше функцией FindString() ищем что нужно.

0

3

Вот что получилось. Вроде как все работает.
Огромное спасибо Петру за помощь.

Код:
#FILE_LOG = "файл txt" 
#FILE_EXE = "файл exe"

Repeat                                                    ;начало цикла
Delay(300000)

If ReadFile(0, #FILE_LOG)                             ;если файл найден прочитать его 
  Size = Lof(0)                                         ;определить размер файла
  *mem = AllocateMemory(Size)                     ;выделить память по размеру файла             
  If *mem
    ReadData(0, *mem, Size)                         ;если память доступна записать файл в память
    CloseFile(0)                                        ;закрыть файл
    Text.s = PeekS(*mem)                                  ;записать  данные из памяти в строковую переменную
    FreeMemory(*mem)                                        ;освободить память
;     End
  EndIf
EndIf


StringToFind.s = "3001"
 FirstOccurrence.l = FindString(Text, StringToFind, 1)
 SecondOccurrence.l = FindString(Text, StringToFind, FirstOccurrence + 1)
 
 If FirstOccurrence.l > 0
   
   RunProgram(#FILE_EXE)                                        ;запуск испонямого файла
   
 EndIf
 
 ForEver                                                       ; конец цикла

0

4

Подскажите пожалуйста, как сделать службу Windows.
Возможно ли обычный exe файл сделать службой?

0

5

Artur написал(а):

Возможно ли обычный exe файл сделать службой?

Да.
http://purebasic.info/phpBB3ex/viewtopi … amp;t=3191

0

6

Ничего не получается. Сделал так

Код:
ServiceName.s = "имя"
DisplayName.s = "имя"
PathToServiceEXE.s = "C:\add\file.exe"
Description.s = "описание"


Result = Installservice(ServiceName.s, DisplayName.s, PathToServiceEXE.s, Description.s, #SERVICE_DEMAND_START=$00000003)

Что делаю не правильно?

0

7

Artur написал(а):

Ничего не получается.

Подробнее можно? Что именно не получается?
Службу зарегистрировал в системе? Программу нужно скомпилировать и запустить с параметром -i в командной строке.

0

8

При компиляции пишет "CreateService Failed"
Так должно быть?

0

9

Artur написал(а):

При компиляции пишет "CreateService Failed"

Нужно создать исполняемый файл и его запускать, а не из IDE. Файл должен быть в папке "C:\add\" и иметь имя "file.exe".
И скорее всего, для инсталляции службы понадобятся права администратора.

0

10

Файл должен быть в папке "C:\add\" и иметь имя "file.exe".

Службу тоже как ехе сохранять? А как же одинаковые файлы в одной папке?

0

11

Служба это обычный EXE файл, но с особой структурой кода.

0

12

Хотелось бы сделать программу мониторинга.
Обычный «пинг», около 30 машин. 
IP адреса считывать из текстового файла. По очереди пинговать. Если машина не доступна, вывести окно с сообщением. С чего начать?

0

13

Сделал так

Код:
#FILE_IP = 1


 NewList FileContents.s()
 If ReadFile(#FILE_IP, "IP.txt")
   While Eof(#FILE_IP) = #False
     AddElement(FileContents())
     FileContents() = ReadString(#FILE_IP)
   Wend
   CloseFile(#FILE_IP)
 Else 
   MessageRequester("Ошибка", "Не найден файл с IP адресами" ,#MB_OK|#MB_ICONERROR)
   End
EndIf


ForEach FileContents()
  
   Text.s = FileContents()
   Result = RunProgram("ping", Text, "")

Вроде работает. Как же теперь вывести сообщение если машина не доступна?

Если делать так

Код:
ForEach FileContents()
  
   Text.s = FileContents()
   Result = RunProgram("ping", Text, "")
   
   If Result <= 0
     
     MessageRequester ("", "!")
     EndIf
   
   
     
  Next

Так он проверяет работоспособность самой программы “ping”. Как быть?

0

14

Если нужно выполнить именно команду "ping" в консоли, то нужно потом прочитать результат из консоли и проанализировать его. Пример получения результата из консоли. Ввод команды в консоль игры
Но можно обойтись и без команды "ping". http://purebasic.info/phpBB3ex/viewtopi … &t=846

0

15

Вот, что получилось

Код:
#FILE_IP = 1
#FILE_LOGS = "DRS_log.txt"

InitNetwork()

Procedure ping(in_ip.s)
  Protected *host.hostent, ret.l
  host.s = in_ip
  *host = gethostbyname_(host)
  If *host
    ret = PeekL(PeekL(*host\h_addr_list))
  Else
    ret = *host
  EndIf
  sel_ip = ret  
  ResultSize.l = SizeOf(ICMP_ECHO_REPLY) + 255
  *Result = AllocateMemory(ResultSize)
  *Echo.ICMP_ECHO_REPLY = *Result
 
        hFile.l = IcmpCreateFile_()
       
       lngResult.l = IcmpSendEcho_(hFile, sel_ip, Space(255), 255, 0, *Result, ResultSize, 2000)
       If lngResult
        
          ProcedureReturn #False
       Else
          ProcedureReturn #True
       EndIf
  
      IcmpCloseHandle_(hFile)
   FreeMemory(*Result)

 EndProcedure
 
 
 AddDate_LOGS.s = FormatDate("Дата:%dd.%mm.%yyyy Время:%hh.%ii.%ss", AddDate(Date(), #PB_Date_Year, 0))
 
    If OpenFile(0, #FILE_LOGS)    ; открываем файл лога, если его нет, создаем 
    FileSeek(0, Lof(0))         
    WriteStringN(0, AddDate_LOGS.s + " старт мониторига...")                ;пишем результат 
    CloseFile(0)                                        ;закрываем файл лога
  EndIf
 



 NewList FileContents.s()
 If ReadFile(#FILE_IP, "IP.txt")
   While Eof(#FILE_IP) = #False
     AddElement(FileContents())
     FileContents() = ReadString(#FILE_IP)
   Wend
   CloseFile(#FILE_IP)
 Else 
   MessageRequester("Ошибка", "Не найден файл с IP адресами" ,#MB_OK|#MB_ICONERROR)
   End
 EndIf
 
 
 
 Repeat
 
 ForEach FileContents()
   
   Text.s = FileContents()
 
   If ping (Text.s)
     
If OpenFile(0, #FILE_LOGS)    ;открываем файл лога, если его нет, создаем 
    FileSeek(0, Lof(0))         
    WriteStringN(0, "IP:" + Text.s + " Статус:" + " коммутатор не доступен! " +  AddDate_LOGS.s)          ;пишем результат         
    CloseFile(0)                                ;закрываем файл лога
    
    MessageRequester("", Text.s + " коммутатор не доступен!", #MB_OK|#MB_ICONINFORMATION)
  EndIf 
  
  
     
EndIf

Next

ForEver

«MessageRequester» останавливает работу программы,  до нажатие кнопки «ОК» пользователем.
Как сделать  продолжение записи лога?
Сделать для «MessageRequester» отдельный цикл?

0

16

Можно отображать сообщение из отдельного потока, но лучше отображать сведения в консоли, т. к. если окажется недоступны много узлов, то весь экран заполнят окна, что на мой взгляд неудобно.

0

17

Спасибо Пётр за помощь! Для лога создал отдельный «ехе», для сообщения отдельный.

0

18

Зачем отдельный EXE если достаточно отдельного потока?
Пример вывода сообщения в отдельном потоке (каждое сообщение в своем потоке).

Код:
CompilerIf #PB_Compiler_Thread=0
  MessageRequester("", "Включите поддержку потоков!")
  End
CompilerEndIf

Structure MsgParam
  Title.s
  Message.s
  Flag.l
EndStructure

Procedure Message(*Param.MsgParam)
  If *Param
    MessageRequester(*Param\Title, *Param\Message, *Param\Flag)
    ClearStructure(*Param, MsgParam)
    FreeMemory(*Param)
  EndIf
EndProcedure

*x.MsgParam
For i=1 To 10
  *x=AllocateMemory(SizeOf(MsgParam))
  If *x
    InitializeStructure(*x, MsgParam)
    *x\Title="Сообщение"
    *x\Message="Поток номер "+Str(i)
    If CreateThread(@Message(), *x)=0 ; Ошибка создания потока.
      ClearStructure(*x, MsgParam)
      FreeMemory(*x)
    EndIf
  EndIf
Next

MessageRequester("", "Нажмите ОК для завершения работы проги")

0

19

По вашему совету сделал вывод сообщения в консоле

Код:
#FILE_IP = 1
#FILE_LOGS = "C:\DRS_log.txt"

Structure MsgParam
  Title.s
  Message.s
  Flag.l
EndStructure

InitNetwork()

Procedure ping(in_ip.s)
  Protected *host.hostent, RET.l
  host.s = in_ip
  *host = gethostbyname_(host)
  If *host
    RET = PeekL(PeekL(*host\h_addr_list))
  Else
    RET = *host
  EndIf
  sel_ip = RET  
  ResultSize.l = SizeOf(ICMP_ECHO_REPLY) + 255
  *Result = AllocateMemory(ResultSize)
  *Echo.ICMP_ECHO_REPLY = *Result
 
        hFile.l = IcmpCreateFile_()
       
       lngResult.l = IcmpSendEcho_(hFile, sel_ip, Space(255), 255, 0, *Result, ResultSize, 2000)
       If lngResult
        
          ProcedureReturn #False
       Else
          ProcedureReturn #True
       EndIf
  
      IcmpCloseHandle_(hFile)
   FreeMemory(*Result)

 EndProcedure
 
Procedure.s CharToOem(String.s) 
  CharToOem_(@String, @String) 
  ProcedureReturn String 
EndProcedure

 
 AddDate_START.s = FormatDate("%dd.%mm.%yyyy %hh.%ii.%ss", AddDate(Date(), #PB_Date_Year, 0))
 
 
    If OpenFile(0, #FILE_LOGS)    ; открываем файл лога, если его нет, создаем 
    FileSeek(0, Lof(0))         
    WriteStringN(0, AddDate_START.s + " старт мониторига...")                ;пишем результат 
    CloseFile(0)                                        ;закрываем файл лога
  EndIf
 
  
 NewList FileContents.s()
 If ReadFile(#FILE_IP, "C:\IP.txt")
   While Eof(#FILE_IP) = #False
     AddElement(FileContents())
     FileContents() = ReadString(#FILE_IP)
   Wend
   CloseFile(#FILE_IP)
 Else 
   MessageRequester("Ошибка", "Не найден файл с IP адресами" ,#MB_OK|#MB_ICONERROR)
   End
 EndIf
 

 Repeat
   
   Delay (200)
   
 ForEach FileContents()
   
   Text.s = FileContents()
 
   If ping(Text.s)
     
     AddDate_LOGS.s = FormatDate("%dd.%mm.%yyyy %hh.%ii.%ss", AddDate(Date(), #PB_Date_Year, 0))  
     
     
     If OpenConsole()
       Print(CharToOem("Коммутатор " + Text.s + " не доступен!"))
       Delay(8000)
       CloseConsole()
    EndIf     

If OpenFile(0, #FILE_LOGS)    ;открываем файл лога, если его нет, создаем 
    FileSeek(0, Lof(0))         
    WriteStringN(0, Text.s + " коммутатор не доступен! " +  AddDate_LOGS.s)          ;пишем результат         
    CloseFile(0)                                ;закрываем файл лога
  EndIf   
EndIf

Next

ForEver

0

20

Только зачем открыть и закрывать консоль?
Ее можно открыть один раз в начале проги и выводить в нее сообщения.

0

21

Имеется в виду постоянно, или  когда машина не доступна?
Пинг нужен в фоновом режиме.

0

22

Тогда можно отображать всплывающее окно над треем (добавив туда значок).

0

23

Здравствуйте.
Появилась проблема с мониторингом. Пингуется 45 машин. При запуске все нормально. Создает лог, с этим все нормально. Прихожу с утра проверяю лог, объем большой все пропадало! А в реальности все пингуется! Не могу понять в чем проблема

0

24

Может фаервол блокирует считая это DDoS атакой?

0

25

Похоже с ОС проблемы. С этим разберемся. Если коммутатор не доступен, появляется окно консоли. Показывает время, IP коммутатора на момент недоступности. Как сделать так,что б при нажатии закрыть пинг продолжался?

0

26

Я так думаю по такому принципу как из сообщения "19". Не могу понять как это сделать с консолью.

0

27

Если закрывают консоль, то программа завершается. Это похоже на уровне ОС.

0

28

Я наверное не ясно выразился. Хотелось бы узнать, этот код можно как то под консоль переделать?

Код:
CompilerIf #PB_Compiler_Thread=0
  MessageRequester("", "Включите поддержку потоков!")
  End
CompilerEndIf

Structure MsgParam
  Title.s
  Message.s
  Flag.l
EndStructure

Procedure Message(*Param.MsgParam)
  If *Param
    MessageRequester(*Param\Title, *Param\Message, *Param\Flag)
    ClearStructure(*Param, MsgParam)
    FreeMemory(*Param)
  EndIf
EndProcedure

*x.MsgParam
For i=1 To 10
  *x=AllocateMemory(SizeOf(MsgParam))
  If *x
    InitializeStructure(*x, MsgParam)
    *x\Title="Сообщение"
    *x\Message="Поток номер "+Str(i)
    If CreateThread(@Message(), *x)=0 ; Ошибка создания потока.
      ClearStructure(*x, MsgParam)
      FreeMemory(*x)
    EndIf
  EndIf
Next

MessageRequester("", "Нажмите ОК для завершения работы проги")

0

29

В случае использования консоли, код значительно упрощается.

Код:
OpenConsole()
For i=1 To 10
  PrintN(Str(i))
Next
MessageRequester("", "Нажмите ОК для завершения работы проги")

0

30

Код:
#FILE_IP = 1
#FILE_LOGS = "C:\DRS_log.txt"

CompilerIf #PB_Compiler_Thread=0
  MessageRequester("", "Включите поддержку потоков!" ,#MB_OK|#MB_ICONERROR)
  End
CompilerEndIf


Structure MsgParam
  Title.s
  Message.s
  Flag.l
EndStructure

Delay(1000)

InitNetwork()

Procedure ping(in_ip.s)
  Protected *host.hostent, ret.l
  host.s = in_ip
  *host = gethostbyname_(host)
  If *host
    ret = PeekL(PeekL(*host\h_addr_list))
  Else
    ret = *host
  EndIf
  sel_ip = ret  
  ResultSize.l = SizeOf(ICMP_ECHO_REPLY) + 255
  *Result = AllocateMemory(ResultSize)
  *Echo.ICMP_ECHO_REPLY = *Result
 
        hFile.l = IcmpCreateFile_()
       
       lngResult.l = IcmpSendEcho_(hFile, sel_ip, Space(255), 255, 0, *Result, ResultSize, 2000)
       If lngResult
        
          ProcedureReturn #True
       Else
          ProcedureReturn #False
       EndIf
  
      IcmpCloseHandle_(hFile)
   FreeMemory(*Result)

 EndProcedure
 
Procedure.s CharToOem(String.s) ; вывод собщени на русском языке
  CharToOem_(@String, @String) 
  ProcedureReturn String 
EndProcedure
  
 AddDate_START.s = FormatDate("%dd.%mm.%yyyy %hh.%ii.%ss", AddDate(Date(), #PB_Date_Year, 0))
 
    If OpenFile(0, #FILE_LOGS)    ; открываем файл лога, если его нет, создаем 
    FileSeek(0, Lof(0))         
    WriteStringN(0, AddDate_START.s + " старт мониторига...")                ;пишем результат 
    CloseFile(0)                                        ;закрываем файл лога
  EndIf
 

 NewList FileContents.s()
 If ReadFile(#FILE_IP, "C:\IP.txt")
   While Eof(#FILE_IP) = #False
     AddElement(FileContents())
     FileContents() = ReadString(#FILE_IP)
   Wend
   CloseFile(#FILE_IP)
 Else 
   MessageRequester("Ошибка", "Не найден файл с IP адресами" ,#MB_OK|#MB_ICONERROR)
   End
 EndIf
 
 
 
 Repeat
   
    ForEach FileContents()
   
       AddDate_LOGS.s = FormatDate("%dd.%mm.%yyyy %hh.%ii.%ss", AddDate(Date(), #PB_Date_Year, 0))
       Text.s = FileContents()
       Delay (700)
       
  If ping (Text.s)
          
        Else
          
              If OpenConsole()
               ConsoleTitle (CharToOem("Мониторинг ДРС"))
               ConsoleColor(4, 0)
               PrintN(CharToOem("Коммутатор " + Text.s + " не доступен!               " + AddDate_LOGS.s)) 
               EndIf
              
              
          If OpenFile(0, #FILE_LOGS)    ;открываем файл лога, если его нет, создаем 
              FileSeek(0, Lof(0))         
              WriteStringN(0, Text.s + " коммутатор не доступен! " +  AddDate_LOGS.s)          ;пишем результат         
              CloseFile(0)                                ;закрываем файл лога
            EndIf 
        
   EndIf

Next


ForEver
Код:
              If OpenConsole()
               ConsoleTitle (CharToOem("Мониторинг ДРС"))
               ConsoleColor(4, 0)
               PrintN(CharToOem("Коммутатор " + Text.s + " не доступен!               " + AddDate_LOGS.s)) 
               EndIf

Вот эту часть в отдельном потоке можно сделать?
Хотелось бы так: коммутатор стал не доступен, открылось окно консоли, показал не доступные коммутаторы. Пользователь закрывает окно консоли. Если появляются не доступные коммутаторы, снова открывается окно.
Если делать по тому примеру, после закрытия окна консоли прерывается цикл пинга.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как найти символы в тексте?