LINUX.ORG.RU

Как открыть папку в проводнике и желательно ещё выделить нужный файл?

 , ,


0

1

Здравствуйте,

Пытаюсь открыть папку командой: execlp(«xdg-open», «xdg-open», «/root/Desktop/mtest/Project/DATA», NULL); Но почему-то вылезает MessageBox с сообщением «Malformed url» При этом если напечатать в Терминале: xdg-open /root/Desktop/mtest/Project/DATA , то папка отлично открывается.

В идеале нужно ещё не просто папку открывать, а выделить в ней нужный файл, но это уже вторая задача.

Пробую на Fedora-64, но нужно, чтобы везде работало, ну или почти везде.



Последнее исправление: Dimez (всего исправлений: 2)

В посте теги плохие (тут надо было бы добавить c и posix) и оформление плохое (смотри подвал страницы для ссылки).

Попробуй вместо xdg-open перехватывать в скрипт и выводить входящую строку, будет ли путь одинаковый.

Bfgeshka ★★★★★
()
Ответ на: комментарий от vbr

return execlp(«xdg-open», «xdg-open», «/home/username/tmp/241107/xt», NULL);

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

А файл выделяется, запуская, непосредственно, nautilus /path/to/file

Это надо так ? execlp(«nautilus», «nautilus», «/path/to/file», NULL);

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

Так у меня же вроде то же самое

Прям этот код у тебя не работает? Если его сохранить в файл и скомпилировать. Ну путь исправить на существующий.

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

Для кода тут есть специальная разметка. https://www.linux.org.ru/help/markdown.md тут подробней можно почитать. Если вкратце, то блок кода надо выделять тройными обратными апострофами в начале и в конце.

Это надо так ? execlp(«nautilus», «nautilus», «/path/to/file», NULL);

Да.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от Bfgeshka

Я добавил теги c и posix, но, честно говоря, здесь всё как-то странно сделано - я сначала начал было эти теги писать, но мне вылезло сообщение типа «неправильные теги», т.е. надо лазить по какому-то списку и искать там имеющиеся варианты.

Попробуй вместо xdg-open перехватывать в скрипт и выводить входящую строку, будет ли путь одинаковый.

Я не знаю, как сделать то, о чем вы пишите.

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

Я не знаю, как сделать то, о чем вы пишите.

Создай шелл-скрипт, которы вызывает echo на входящий аргумент, вызывай его вместо xdg-open.

Это надо так ? execlp(«nautilus», «nautilus», «/path/to/file», NULL);

Если ты хочешь, чтобы «везде работало», то не надо, т.к. не у всех есть наутилус. Откровенно говоря, не у всех и xdg-open есть, но тут ты не выиграешь.

Bfgeshka ★★★★★
()

нужно, чтобы везде работало, ну или почти везде

Универсального решения не будет, в разных дистрах разные «проводники». Я бы рекомендовал подумать над принципиально иным подходом к решению задачи верхнего уровня, если нужно, чтобы работало везде.

buddhist ★★★★★
()

ТСу: Я винфакеров и отвечавших им матершинников почистил, конечно, но откровенно говоря, ты их сам терминологией спровоцировал.

«Папка» ещё ладно, но никакого «проводника» в линуксах нет, есть файловый менеджер по умолчанию. И они, как выше справедливо отметили, могут быть разными. Dolphin, Nautilus, PCManFM, nemo… много их.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от Bfgeshka

Потому что в ОП нет никаких проблем с самим вызовом функции. Описанная в ОП проблема - это что именно передать в вызываемую функцию. И это не описывается posix’ом, это описывается Free Desktop’ом.

LamerOk ★★★★★
()
Ответ на: комментарий от hobbit

ты их сам терминологией спровоцировал

То есть модератор сейчас оправдывает оскорбление участника просто потому, что тот использует «неправильную» терминологию? Ты тогда в правила сайта эти моменты пропиши, чтобы новичкам хотя бы было где узнать на каком языке общаться на форуме.

stabilitron
()
Ответ на: комментарий от stabilitron

Где ты там «оскорбление» увидел, поехавший? Мой хрустальный шар говорит мне, что ты и не видел - у тебя не достаточно прав для просмотра удалённых.

Так вот сообщаю - там вообще не было оскорбления ОПа-сами-знаете-кого.

LamerOk ★★★★★
()

Вероятно твой файловый менеджер ругается на формат пути, попробуй так

execlp(«xdg-open», «xdg-open», «file:///root/Desktop/mtest/Project/DATA», NULL);

Хотя возможно у тебя xdg-open особенный, глянь cat /usr/bin/xdg-open | grep Malformed

Или ты тупо путь неправильный указываешь, учитывая слова типа папку то в линуксе есть разница между data и DATA точно ли путь называется так как ты его прописал с учётом КАПСА.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Так у него xdg-open из терминала работает. Я всё же думаю, что у него в коде проблема, поэтому и попросил запустить заведомо рабочий код, но пока топикстартер молчит.

PS в твоём коде кавычки-ёлочки. Вспомним добрым словом того товарища, который реализовал эту важную фичу автозамены кавычек.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от vbr

Вспомним добрым словом того товарища, который реализовал эту важную фичу автозамены кавычек.

xDD

Это всё же творчество L-O-R’а, лоровский движок нормально обрабатывает их внутри блоков форматированного текста:

Внутри одной строки: Кавычки нормальные: "парные".

Отдельный блок:

Кавычки нормальные: "парные".
LamerOk ★★★★★
()
Ответ на: комментарий от vbr

PS в твоём коде кавычки-ёлочки.

Ага, мой косяк я тупо скопировал и отредактировал, не глядя.

Так у него xdg-open из терминала работает.

Значит надо рыть глубже, тут не магия, переменные окружения, особенности реализации xdg-open (это тупо скрипт), зависимость от всего этого в вызове процесса файлового менеджера и передачи ему параметров. Может у него вообще shell какой экзотический где xdg-open является частью внутренней команды оболочки, а не утилитой, но она всё же есть в /usr/bin и прочее прочее, тут могут быть десятки переменных и происходить вообще всё что угодно.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от anonymous

По ссылке от анонимуса, есть отличное решение

dbus-send --session --print-reply --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 org.freedesktop.FileManager1.ShowItems array:string:"file:///home/me/path/to/folder/or/file" string:""

Проверил в дельфине - работает. Рядом там, кстати, ещё и вариант для множественного выделения.

PS: Для себя ссылочку сохранил, такое может пригодится в будущем.

Loki13 ★★★★★
()
Ответ на: комментарий от vbr

Я всё же думаю, что у него в коде проблема

Я думаю, что дело в том, что я использую wxWidgets. Потому что если вызвать то же самое, но через его функцию, то работает:

wxShell("xdg-open /root/Desktop/mtest/Project/DATA");

От nautilus-а я решил пока отказаться, потому что у меня его у самого нет.

И спасибо за помощь!

Odin_KG
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Или ты тупо путь неправильный указываешь, учитывая слова типа папку то в линуксе есть разница между data и DATA точно ли путь называется так как ты его прописал с учётом КАПСА.

Я вообще сначала проверяю, есть ли папка с таким путем, а потом проверяю, может быть есть файл с таким путём. А уже потом пытаюсь это дело открыть в файловом менеджере.

Я выше ответил, что по всей вероятности мешался wxWidgets.

Odin_KG
() автор топика
Ответ на: комментарий от hobbit

ТСу: Я винфакеров и отвечавших им матершинников почистил, конечно, но откровенно говоря, ты их сам терминологией спровоцировал.

Спасибо. Всё же замечу, что когда спрашиваешь на каком-нибудь западном форуме, то тебе пытаются помочь, даже если английский кривоват. А когда спрашиваешь «у наших», то обычно всё начинается с фразы «ты дурак ?» и ей же и заканчивается. К сожалению, Россия хронически больна гордыней, а остальное лишь следствие.

«Папка» ещё ладно, но никакого «проводника» в линуксах нет, есть файловый менеджер по умолчанию. И они, как выше справедливо отметили, могут быть разными. Dolphin, Nautilus, PCManFM, nemo… много их.

ОК. Как решить мою проблему универсально ? Изучить терминологию, разобраться с парой десятков файловых менеджеров, лет пять попрактиковаться и ура-а-а ?

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

ОК. Как решить мою проблему универсально ? Изучить терминологию, разобраться с парой десятков файловых менеджеров, лет пять попрактиковаться и ура-а-а ?

Теоретически через dbus вроде показали вариант, но надо тестировать на паре десятков файловых менеджеров, не уверен, что все они поддерживают это.

Практически я бы сделал для GNOME и всё. Это главный десктоп на линуксе, остальные по-мне поддерживать особого смысла нет.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от Odin_KG

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

Если английский кривоват — да. Но у тебя же здесь не английский или русский кривоват, а терминология странная для программиста. В англоязычном интернете точно так же придираются к такому, например если бы было folder, Explorer и MessageBox. Ну точнее, как повезёт, могут иногда и не придраться. Ну и тут тоже только один чел придрался, да и того удалили. Не надо всё время искать «русский след». Есть на русскоязычных форумах своя специфика, но проявляется она точно не в этом, хотя такой миф почему-то ходит. В основном среди тех, кто на англоязычных форумах мало общается, а замечает только заплюсованные ответы на каком-нибудь stackoverflow, выданные гуглом…

ОК. Как решить мою проблему универсально ?

Честно говоря, универсально, наверное, никак. У пользователя вообще может не оказаться xdg-open и гуёвого файлового-менеджера. В этом случае придётся ещё и угадывать, какой у него терминал, и есть ли какой-нибудь FM в нём.

А какова вообще задача выше уровнем? Не «открыть файл в „проводнике“», а зачем это тебе надо? В зависимости от ответа может быть разный вариант обходных решений. Например, определить, если использоуется Gnome, KDE или XFCE, и открыть соответствующим FM, а если нет, то откатиться на xdg-open и открыть директорию, а если и его нет, то открыть в браузере (например, если задача решается и через браузер), или открыть терминал с ls, или ещё что — может вообще тупо диалог сохранения или открытия файла в самой твоей проге внутри открыть, ну и т.д.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от Odin_KG

Я вообще сначала проверяю, есть ли папка с таким путем, а потом проверяю, может быть есть файл с таким путём.

Ты не можешь из своей программы проверить, если ли папка с таким путём в другой.

Папка — это элемент организации GUI. Она может отображать собой каталог (директорию) ФС, или же запись в БД, или ещё что-то. Например, помимо твоего «проводничка», есть папки закладок в браузере, и они не являются каталогами с файлами, или есть папки писем в e-mail клиенте или веб-приложении — они тоже не являются каталогами с файлами, как правило. При этом, естественно, точно так же, можно пользоваться каталогами и файлами без папок, например, в CLI.

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

Это может звучать как придирки и «английский так себе», но в некоторых случаях подобное действительно мешает понять, ровно то имел в виду вопрошающий, или всё же что-то другое. Даже в данном случае, как можно видеть выше, есть небольшое, но сомнение. Я, конечно, понимаю, что ты имел в виду каталог. Но вдруг! Особенно именно учитывая контекст именно интеракций своей программы с файловым менеджером, являющийся основным в данной теме, всякое может быть.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от stabilitron

модератор сейчас оправдывает оскорбление участника

Оправдываю? То, что я снёс два комментария со снятием скора это «оправдываю»? Держи клоуна, заслужил. А ТСу просто объясняю, откуда такое отношение может взяться. Никого не оправдывая.

И да, «на винфак» это не личное оскорбление, это в данном случае просто глуповатое заявление. А вот того, кто на винфак послал, уже явно оскорбили, кстати. Я почистил обоих, если что.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от Odin_KG

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

Так наверное, на этом тогда и надо остановиться. И скорее всего, это будет даже более кроссплатформенно, чем вариант из ОП.

А вот советчиков «поддерживай Gnome, а на остальное забей» лучше посылать подальше.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

«Папка» ещё ладно

А что с ней не так? Или тупая калька с английского «директория» лучше, чем устоявшийся перевод? То что перевод от винды не делает его хуже. Смысл файловой системы и на винде и на линуксе один и тот же.

Наоборот нужно ставить на место любителей поиронизировать над «папкой».

ox55ff ★★★★★
()
Ответ на: комментарий от hobbit

Или вынести этот участок кода в плагин, что даст неравнодушным пользователям возможность подстраиваться под разные DE и платформы.

anonymous
()
Ответ на: комментарий от ox55ff

Или тупая калька с английского «директория» лучше, чем устоявшийся перевод?

Нет, устоявшийся перевод (каталог) лучше. Хотя и «директория» тоже норм — по крайней мере тот же объект означает. «Папка» (folder) означает другой объект. В ней как таковой ничего плохого нет. Плохо, когда это слово используется к самому объекту файловой систему, а не элементу организации графического интерфейса, который может быть использован как для отображения элементов ФС, так и много чего ещё.

CrX ★★★★★
()
Ответ на: комментарий от Odin_KG

Всё же замечу, что когда спрашиваешь на каком-нибудь западном форуме, то тебе пытаются помочь, даже если английский кривоват. А когда спрашиваешь «у наших», то обычно всё начинается с фразы «ты дурак ?» и ей же и заканчивается.

Ты тут не первый с этой мантрой. Обычно она исходит от любителей двойных стандартов, которые на английских форумах задают нормальные вопросы, тщательно подбирая слова, а на родном постят тупняк. И получают в обоих случаях строго по запрошенному.

Посмотрел твои темы. Тебе давали вполне развёрнутые технические ответы, грех жаловаться. И ты ни одну (!) тему не отметил решённой, даже тему про иконки, хотя уж там на вопрос из ОП тебе ответили исчерпывающе.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

«на винфак» это не личное оскорбление

Так твой комментарий ТСу ничем по сути от «на винфак»-а не отличается.

Ладно, я думаю, что тебя тоже можно понять: тебе, как модеру, приходится тратить время на борьбу с неадекватными комментариями, «спровоцированными неправильной терминологией», ещё и свои решения потом разъясняй.

Держи клоуна, заслужил.

Запишу в личные достижения :)

stabilitron
()
Ответ на: комментарий от CrX

Но у тебя же здесь не английский или русский кривоват, а терминология странная для программиста.

Дык, сразу же по моему вопросу можно определить, что я дурачок, который задаёт тупые вопросы. Я реально глупый, и просто пытаюсь хоть чему-то научиться у гуру.

Честно говоря, универсально, наверное, никак. У пользователя вообще может не оказаться xdg-open и гуёвого файлового-менеджера.

Я бы хотел знать, исходя того, что в OS имеется команда xdg-open, как мне не просто открыть папку (ой, простите каталог), но и выделить в ней нужный файл ?

Извините, если я кого-то задел неправильной терминологией - это всё от моей глупости новичка. Но надеюсь гуру дадут прямой и исчерпывающий ответ на мой вопрос.

Odin_KG
() автор топика
Ответ на: комментарий от Odin_KG

Я бы хотел знать, исходя того, что в OS имеется команда xdg-open, как мне не просто открыть папку (ой, простите каталог), но и выделить в ней нужный файл ?

xdg-open сам по себе не умеет выделять где-то нужные файлы. Всё, что он умеет — это вызывать программы в соответствии с тем, что ему дали в качестве аргумента. И вот сама программа может уже открыть каталог и выделить в нём файл, а может и просто открыть, ничего не выделяя. В некоторых популярных ФМ такая возможность есть, в других её может не быть, или она может быть недоступна для xdg-open.

Поэтому прямо вот в общем случае и универсально — ответ «никак». В каких-то ФМ будет работать, в каких-то нет.

Обходным решением будет пытаться самому определить, какой у юзера ФМ, и если это один из тех популярных, где такая возможно есть, делать это эксплицитно. Если не определили — проверять, есть ли в системе xdg-open. Если есть — просто открывать каталог, в котором находится требуемый файл, им (от выделения придётся отказаться, скорее всего). Если нет — придумать какой-то бэкап вариант, который возможно, гораздо хуже, но всё же лучше, чем ничего: например, открыть файл в браузере, или там, скопировать путь к нему в буфер обмена, или открыть терминал с переходом в нужный каталог и ls в нём, и т.д. — в зависимости от более общей задачи.

Извините, если я кого-то задел неправильной терминологией

Да никого ты не задел. Просто указали на ошибку (ну может изначально в чрезмерно жёсткой форме — но там и потёр модератор уже, считай, что не было) и попросили пояснить, что имелось в виду. А указание на ошибки — это тоже часть обучения, как ни крути. Не принимай близко к сердцу — никто на тебя не в обиде и не задет — просто мотай на ус да и всё.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от CrX

xdg-open сам по себе не умеет выделять где-то нужные файлы.

ОК. Я понял, что никто выделять ничего не умеет, но может быть в конкретном ФМ это и есть. Тогда вопрос снимается.

А указание на ошибки — это тоже часть обучения, как ни крути.

Да, я и собираюсь усердно учиться, чтобы меня оценили и взяли на работу в какую-нибудь компанию, где я буду и дальше учиться пока не сдохну.

Благодарю за консультацию!

Odin_KG
() автор топика
Последнее исправление: Odin_KG (всего исправлений: 1)
Ответ на: комментарий от CrX

И папка и каталог и директория могут означать что угодно. Разумный человек понимает контекст. Или уточняет, если это действительно не очевидно. Неразумный придирается к словам, чтобы накрутить счётчик постов или своё ЧСВ.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)

/root/Desktop/mtest/Project/DATA

А ты приложение своё тоже от рута запускаешь? А терминал у тебя от рута запущен, из которого команда отрабатывает? Может, просто прав нет на открытие каталога?

zimniy
()