Автор Тема: Путь к USB-накопителю в Lazarus [РЕШЕНО]  (Прочитано 5720 раз)

Оффлайн hago

  • Завсегдатай
  • *
  • Сообщений: 62
Подскажите, пожалуйста, есть ли готовая функция для Lazarus, которая возвращала бы путь подключенного USB-накопителю (к примеру, в виде ´/dev/sdc´ или ´/dev/sdb´)?
Кучу сайтов просмотрел - везде примеры работы с USB для Window. A вот для Linux, так ничего и не нашёл. 
Буду очень благодарен за подсказку.
« Последнее редактирование: 20.06.2014 11:45:56 от hago »

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 935
    • Домашняя страница
    • Email
Re: Путь к USB-накопителю в Lazarus
« Ответ #1 : 10.06.2014 23:06:01 »
Парсите вывод lsblk. Можно через /proc/partitions
Андрей Черепанов (cas@)

Оффлайн hago

  • Завсегдатай
  • *
  • Сообщений: 62
Re: Путь к USB-накопителю в Lazarus
« Ответ #2 : 10.06.2014 23:37:03 »
Парсите вывод lsblk. Можно через /proc/partitions

Спасибо за подсказку. Буду дальше разбираться...
Если у кого-то есть ещё идеи, как найти путь к USB при разработки приложения в Lazarus, напишите, пожалуйста, в этой теме.

Оффлайн YYY

  • Мастер
  • ***
  • Сообщений: 5 976
Re: Путь к USB-накопителю в Lazarus
« Ответ #3 : 11.06.2014 02:33:20 »
 udisks --dump

?

правда сейчас udisk2, но там ключик есть

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Путь к USB-накопителю в Lazarus
« Ответ #4 : 11.06.2014 04:46:25 »
Вывод в терминал имён подключённых устройств usb-накопителей
Размышления и решения


Может так как-то подойдёт поискать usb-накопители?
# hwinfo --disk|grep $(ls -L $(find /dev/disk/by-id/ -name *usb*)|head -n 1)
  Device Files: /dev/sdb, /dev/disk/by-id/usb-SEMC_Mass_Storage_4TOTO-0:0, /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0
# ls -l $(find /dev/disk/by-id/ -name *usb*)
lrwxrwxrwx 1 root root  9 июн 11 01:25 /dev/disk/by-id/usb-SEMC_Mass_Storage_4TOTO-0:0 -> ../../sdb
lrwxrwxrwx 1 root root 10 июн 11 01:25 /dev/disk/by-id/usb-SEMC_Mass_Storage_4TOTO-0:0-part1 -> ../../sdb1

Это который:
# cat $(grep -rl usb /proc/scsi/)
   Host scsi4: usb-storage
       Vendor: Sony
      Product: ST15i
Serial Number: 4TOTO
     Protocol: Transparent SCSI
    Transport: Bulk
       Quirks:

Шо-то близко к этому?
# hwinfo --disk|grep $(ls -L $(find /dev/disk/by-id/ -name *usb*)|head -n 1)|cut -d ':' -f2
 /dev/sdb, /dev/disk/by-id/usb-SEMC_Mass_Storage_4TOTO-0
# hwinfo --disk|grep $(ls -L $(find /dev/disk/by-id/ -name *usb*)|head -n 1)|cut -d ':' -f2|cut -d ',' -f1
 /dev/sdb
Из-за 'head -n 1' он найдёт только один usb-накопитель.
Здесь надо бы цикл.
И скрипт немного побольше.


Или вот так пожалуй:
# hwinfo --disk|grep "$(ls -L $(find /dev/disk/by-id/ -name *usb*))"|cut -d ':' -f2|cut -d ',' -f1
 /dev/sdb
 /dev/sdc

Это которое:
# cat $(grep -rl usb /proc/scsi/)
   Host scsi5: usb-storage
       Vendor: UFD 2.0
      Product: Silicon-Power
Serial Number: 4EVOTO
     Protocol: Transparent SCSI
    Transport: Bulk
       Quirks:
   Host scsi4: usb-storage
       Vendor: Sony
      Product: ST15i
Serial Number: 4TOTO
     Protocol: Transparent SCSI
    Transport: Bulk
       Quirks:
# lsusb | head -n 2
Bus 001 Device 005: ID 0fce:e167 Sony Ericsson Mobile Communications AB XPERIA mini
Bus 001 Device 006: ID 090c:1000 Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) Flash Drive

Вроде бы достаточно универсально и мало от чего системного зависит.

Решение I

Пробел тоже можно обрезать sed'ом:
# hwinfo --disk|grep "$(ls -L $(find /dev/disk/by-id/ -name *usb*))"|cut -d ':' -f2|cut -d ',' -f1|sed 's/^ //g'
/dev/sdb
/dev/sdc

Решение II

Ещё вариант до кучи:
# ls -l $(find /dev/disk/by-id/ -name *usb*)|cut -d '>' -f2|sed 's/ ..\/../\/dev/'
/dev/sdb
/dev/sdb1
/dev/sdc
/dev/sdc1

Выборку usb-устройств можно сделать так - по-grep-ав инверсией НЕ:
# ls -l $(find /dev/disk/by-id/ -name *usb*)|cut -d '>' -f2|sed 's/ ..\/../\/dev/'|grep -v sd[a-z][1-9]
/dev/sdb
/dev/sdc
В этой команде sed заменяет относительный на абсолютный путь к файлу устройства.


timetest - тест времени отработки скрипта
(в формате: секунды.доли_секунд)


Единственный вопрос: какую команду использовать?
Понятно что вторая команда выполняется существенно быстрее:
# time -f %e hwinfo --disk|grep "$(ls -L $(find /dev/disk/by-id/ -name *usb*))"|cut -d ':' -f2|cut -d ',' -f1|sed 's/^ //g'
1.09
/dev/sdb
# time -f %e ls -l $(find /dev/disk/by-id/ -name *usb*)|cut -d '>' -f2|sed 's/ ..\/../\/dev/'|grep -v sd[a-z][1-9]
0.00
/dev/sdb

В принципе, этот тест можно считать пижонством.
Но это привычка спектрумиста экономить на тактах процессора: быстро, быстрее, ещё быстрее.
« Последнее редактирование: 11.06.2014 15:32:55 от Speccyfighter »

Оффлайн hago

  • Завсегдатай
  • *
  • Сообщений: 62
Re: Путь к USB-накопителю в Lazarus
« Ответ #5 : 11.06.2014 06:09:00 »
Speccyfighter, благодарю за столь подробный и обширный ответ.
Как закончу свои изыскания, приложу готовую подпрограмму по поиску пути к USB.

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Путь к USB-накопителю в Lazarus
« Ответ #6 : 11.06.2014 06:18:57 »
Я тут в самом конце ещё один вариант забросил, чтобы в одном "ящике" лежал.
В последнем нужны только
# rpm -qf /bin/ls
coreutils-8.21-alt1
# rpm -qf /bin/cut
coreutils-8.21-alt1
# rpm -qf /bin/find
findutils-4.5.11-alt3
# rpm -qf /bin/sed
sed-4.2.2-alt2
# rpm -qf /bin/grep
grep-2.14-alt3
которые есть у любого уважающего себя *nix'оида - базовое и совсем по-минимуму.
;-)
« Последнее редактирование: 11.06.2014 06:46:09 от Speccyfighter »

Оффлайн hago

  • Завсегдатай
  • *
  • Сообщений: 62
Re: Путь к USB-накопителю в Lazarus
« Ответ #7 : 12.06.2014 15:39:43 »
Никак не получается реализовать поиск пути к USB-носителю в Lazarus.
Speccyfighter
, дал замечательный совет, который может это сделать — при помощи команды:

ls -l $(find /dev/disk/by-id/ -name *usb*)|cut -d '>' -f2|sed 's/ ..\/../\/dev/'|grep -v sd[a-z][1-9]
В терминале данная команда работает так, как надо - ­ возвращает путь подключенного к компьютеру USB. А вот  использование этой же команды в программе, созданной в Lazarus, не даёт такого же результата.   
Пытался использовать для варианта:
1) класс Tprocess. Здесь http://wiki.freepascal.org/Executing_External_Programs/ru находится пример, как это можно реализовать. Но проблема-то заключается в том, что Tprocess выполняет только простые команды, типо ls -l или ppc386 -h. Соответственно, с такой сложной командой (ls -l $(find /dev/disk/by-id/ -name *usb*)|cut -d '>' -f2|sed 's/ ..\/../\/dev/'|grep -v sd[a-z][1-9]) не справляется.
2) функция popen (входит в состав модуля UNIX).
popen (f, 'ls -l $(find /dev/disk/by-id/ -name *usb*)|cut -d ''>'' -f2|sed ''s/ ..\/../\/dev/''|grep -v sd[a-z][1-9]', 'r');Проблема та же самая ­ - простые вещи выполняет без проблем, а вот сложные команды обрабатывает неверно. Причём заметил интересную особенность. Если задать на выполнение  такую команду, как ls -l $(find /dev/disk/by-id/ -name *usb*)|cut -d '>' -f2|sed 's/ ..\/../\/dev/'|grep -v sd[a-z][1-9],  возвращает результат команды ls -l (т. е. не перечень подключенных USB, а список файлов с правами доступа). Получается, что все операторы, следующие  после символа $, обрубаются и игнорируются.

Короче, уже и не знаю что делать...
Подскажите, каким ещё образом можно в Lazarus выполнить команду и получить результат выполнения этой команды?
« Последнее редактирование: 12.06.2014 20:12:48 от hago »

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 935
    • Домашняя страница
    • Email
Re: Путь к USB-накопителю в Lazarus
« Ответ #8 : 12.06.2014 17:31:39 »
Кто мешает команду засунуть в скрипт и вызывать его? Это UNIX, здесь использование модульной схемы приветствуется.
Андрей Черепанов (cas@)

Оффлайн yaleks

  • Мастер
  • ***
  • Сообщений: 6 238
Re: Путь к USB-накопителю в Lazarus
« Ответ #9 : 12.06.2014 22:16:52 »
можно и альтернативно получить список файлов и далее всю логику все реализовать на pascal.

Оффлайн hago

  • Завсегдатай
  • *
  • Сообщений: 62
Re: Путь к USB-накопителю в Lazarus
« Ответ #10 : 14.06.2014 19:54:10 »
Два дня назад выполнял команду для поиска подключенный USB:
ls -l $(find /dev/disk/by-id/ -name *usb*)|cut -d '>' -f2|sed 's/ ..\/../\/dev/'|grep -v sd[a-z][1-9]
Все было нормально. А вот сегодня эта же самая команда выдает совершенно другой результат. Вместо перечня подключенных дисков, возвращает список файлов в домашнем каталоге:

-rw-r--r--  1 rutal  rutal         209 июн 10 16:56 fidentify.log
drwxr-xr-x  8 rutal  rutal        4096 июн 14 18:01 Linux
-rw-r--r--  1 rutal  rutal      171520 июн 13 19:52 linux.doc
-rw-------  1 rutal  rutal   904921088 июн 14 17:55 simply.iso
-rw-r--r--  1 rutal  rutal    34517338 июн 13 18:48 rutal.tar.gz
drwxr-xr-x  5 rutal  rutal        4096 июн 12 08:17 Документы
drwxr-xr-x 13 rutal  rutal        4096 июн 14 18:02 Загрузки
drwxr-xr-x  6 rutal  rutal        4096 июн 13 18:19 Программирование
drwxr-xr-x  2 rutal  rutal        4096 июн 13 22:37 Рабочий стол

Не могу понять, что случилось?

Оффлайн sb

  • Модератор глобальный
  • *****
  • Сообщений: 9 001
Re: Путь к USB-накопителю в Lazarus
« Ответ #11 : 14.06.2014 21:08:01 »
Два дня назад выполнял команду для поиска подключенный USB:
У меня результатом выполнения данной команды является список файлов в домашнем каталоге. Но это при отсутствии в системе подключенных через усб накопителей. Если накопитель подключить, то в результате получаем наименование блочного устройства накопителя.

Оффлайн hago

  • Завсегдатай
  • *
  • Сообщений: 62
Re: Путь к USB-накопителю в Lazarus
« Ответ #12 : 14.06.2014 21:36:47 »
У меня результатом выполнения данной команды является список файлов в домашнем каталоге. Но это при отсутствии в системе подключенных через усб накопителей. Если накопитель подключить, то в результате получаем наименование блочного устройства накопителя.

Мне кажется, что у меня сбились какие-то системные настройки и поэтому команда ls ведёт себя так странно.
Вставлен ли USB диск или нет - результат выполнения команды ls -l $(find /dev/disk/by-id/ -name *usb*)|cut -d '>' -f2|sed 's/ ..\/../\/dev/'|grep -v sd[a-z][1-9] один и тот же - отображаются файлы в домашнем каталоге. Если же загружаюсь с live-cd (та же версия AltLinux), то всё работает как надо.
За последние два дня установил несколько программ из Synaptic (среди которых vim, Kate, konqueror). Может это как-то повлияло на работу bash?

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 935
    • Домашняя страница
    • Email
Re: Путь к USB-накопителю в Lazarus
« Ответ #13 : 14.06.2014 22:02:09 »
Не должно. Но скрипт переусложнён, поэтому глючит.
Андрей Черепанов (cas@)

Оффлайн hago

  • Завсегдатай
  • *
  • Сообщений: 62
Re: Путь к USB-накопителю в Lazarus
« Ответ #14 : 14.06.2014 23:32:55 »
Начал разбираться более основательно в структуре скрипта и выяснил, что "глючит" команда find.
Результаты тестов.
1. find /dev/disk/by-id/
/dev/disk/by-id/
/dev/disk/by-id/usb-Verbatim_STORE_N_GO_12050000000291D9-0:0-part2
/dev/disk/by-id/usb-Verbatim_STORE_N_GO_12050000000291D9-0:0-part1
/dev/disk/by-id/usb-Verbatim_STORE_N_GO_12050000000291D9-0:0
/dev/disk/by-id/wwn-0x5001480000000000
/dev/disk/by-id/ata-HL-DT-ST_DVDRAM_GH24NSB0_KKCDC7A3019
/dev/disk/by-id/wwn-0x5000c5002a5538d2-part5
/dev/disk/by-id/ata-ST32000542AS_5XW15LY8-part5
/dev/disk/by-id/wwn-0x5000c5002a5538d2-part2
/dev/disk/by-id/ata-ST32000542AS_5XW15LY8-part2
/dev/disk/by-id/wwn-0x5000c5002a5538d2-part1
/dev/disk/by-id/ata-ST32000542AS_5XW15LY8-part1
/dev/disk/by-id/wwn-0x5000c5002a5538d2-part4
/dev/disk/by-id/ata-ST32000542AS_5XW15LY8-part4
/dev/disk/by-id/wwn-0x5000c5002a5538d2
/dev/disk/by-id/ata-ST32000542AS_5XW15LY8

2. find /dev/disk/by-id/ -name *ata*
/dev/disk/by-id/ata-HL-DT-ST_DVDRAM_GH24NSB0_KKCDC7A3019
/dev/disk/by-id/ata-ST32000542AS_5XW15LY8-part5
/dev/disk/by-id/ata-ST32000542AS_5XW15LY8-part2
/dev/disk/by-id/ata-ST32000542AS_5XW15LY8-part1
/dev/disk/by-id/ata-ST32000542AS_5XW15LY8-part4
/dev/disk/by-id/ata-ST32000542AS_5XW15LY8

3. find /dev/disk/by-id/ -name *usb*
#И вот тут-то самое интересное. Команда find не находит файлы, в имени которых встречается буквосочетание usb.
Вопрос - почему?
Но если задать find /dev/disk/by-id/ -name *usb-* (обращаю внимание - маска поиска *usb-*, а не *usb*), получаем
/dev/disk/by-id/usb-Verbatim_STORE_N_GO_12050000000291D9-0:0-part2
/dev/disk/by-id/usb-Verbatim_STORE_N_GO_12050000000291D9-0:0-part1
/dev/disk/by-id/usb-Verbatim_STORE_N_GO_12050000000291D9-0:0
Вот тут-то и ответ к  загадке. :-) :-) :-)
Таким образом, окончательная команда по поиску пути к usb-дискам будет иметь следующий вид:
ls -l $(find /dev/disk/by-id/ -name *usb-*)|cut -d '>' -f2|sed 's/ ..\/../\/dev/'|grep -v sd[a-z][1-9]
И тут всё работает как надо.