LINUX.ORG.RU

Как программно удалить файл в корзину?

 


0

2

Погуглил использование gio, но неужели при удалении нескольких тысяч файлов надо несколько тысяч раз загружать эту утилиту в память? Предлагался также ручной метод создать папку ~/.local/share/Trash/files/ но тут нюанс, файл должен остаться на том же диске, то есть получить точку монтирования и в корне создать папку Trash, и ещё проблема конфликта имён.


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

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

один раз обратившись к утилите, ее код кешируется в памяти

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

не нравится утилита - обращайся напрямую к функциям ос.

Вот это я и хотел увидеть, какой нибудь API…

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

Помнится, в вендах был со времëн ХР так называемый Prefetcher, который пытался угадать, какие програмиы пользователь чаще всего использует, и всячески пытался «оптимизировать» их запуск: перемещал в начало диска, а при загрузке системы кэшировал их в память (последнее не точно). Здесь, в онтопике, же достаточно было один раз прочитать бинарник в память и, пока он в ней, обращение к нему было моментальным с времëн царя Гороха.

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

Бинарник висит в памяти, пока к нему есть кому обращаться. Через время, если никто его не трогает, он оттуда вытесняется в своп, а если свопа нет – удаляется из памяти.

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

и, пока он в ней, обращение к нему было моментальным с времëн царя Гороха.

А это не эффект кеша жёсткого диска, который кеширует адреса данных которые использовались последний раз? Просто быстро это не значит он в памяти. Завершение команды сопровождается выгрузкой утилиты. Поэтому если я буду вызывать через RunProgram() я в совершенстве понимаю что это закачивается выгрузкой.

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

То есть если я юзаю проги, то они не выгружаются и забивают память пока не зависнет?

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

Таким образом, в норме должно использоваться почти 100% памяти — ведь неиспользуемая память — это потраченная зря память. Но при этом доступно может быть много.

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

не нравится утилита - обращайся напрямую к функциям ос.

Вот это я и хотел увидеть, какой нибудь API…

В GNU/Linux нет никакой корзины, поэтому API к функциям ОС тут быть не может. Есть возможность узнать, где корень маунтпоинта, создать там каталог .Trash (или Trash, или какой там тебе хочется), затем переместить туда файл. Возможно с переименованием в заранее уникальное имя, дабы избежать дублирования. Вот это всё напрямую через функции ОС.

У конкретных реализаций корзины может быть свой API. И ты можешь его использовать. Что ты, видимо, и делаешь с помощь этого своего gio (я даже не смотрел, что это, да). Естественно, чтобы использовать какой-то API, используемые функции придётся загрузить в память — иначе и не бывает.

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

Кэшей больше чем один. Во-первых, недоступный программно кэш HHD в памяти самого диска; во-вторых, кэш в оперативной памяти. Бинарник будет закэширован в как минимум последней, какое-то время будет болтаться там, а потом ОС его оттуда уберëт, если будет видеть, что бинарь больше не трогают.

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

XDG … MIME

Что-то ты просто накидал знакомые слова

ИИ: Нет, xdg-utils (пакет, содержащий такие утилиты, как xdg-open, xdg-mime, xdg-email и др.) не умеет удалять файлы или перемещать их в корзину.

Если что я активно использую xdg для запуска файлов. И какая связь с MIME? Это вообще определятор типа.

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

Он хочет с привязкой к точке монтирования — чтобы файл (его содержимое) не переносить между партициями/дисками, если он не там же, где $XDG_DATA_HOME, а просто «переименовать».

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

Завершение команды сопровождается выгрузкой утилиты.

Неа, нахрена ?? пока есть свободная память, ничего из памяти не вытесняется. только когда свободной памяти становится меньше определенного процента, только тогда начинается очистка памяти.
погугли «linux eat ram» :)

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

${XDG_DATA_HOME}/Trash

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

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

Неа, нахрена ?? пока есть свободная память, ничего из памяти не вытесняется.

Да, этот текст гуглится почитаю ещё немного об этом… в таком случае воспользуюсь этим способом.

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

Причëм, так делают чуть более чем все демоны. При первом запуске на файл на диске ставится блокировка, файл считывается в память, ОС настраивает контекст и передаëт управление на точку входа. Так делали и TSR-программы в DOS, за тем исключением, что память тогда была дорога и еë было крайне мало. Но система работала.

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

Тут некоторые продвигают проприетарный бейсик и не понимают сарказма.

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

а ты целую рекламную компанию провёл

Вот он интриган! Теперь эта рекламная компания подаст на него в суд за мошенничество.

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

Бинарник висит в памяти, пока к нему есть кому обращаться. Через время, если никто его не трогает, он оттуда вытесняется в своп

Только не сбрасывается в своп, конечно. Бинарник это read-only данные, которые с того же харда были загружены, нет смысла их записывать обратно. Просто будет выгружен из памяти, а при повторном обращении - повторно загружен.

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

надо несколько тысяч раз загружать эту утилиту в память?

Ядро Линукс кэширует страницы кода так же, как процессор кэширует код в кэше для инструкций. Когда программа заканчивает исполнение, её страницы маркируются как free, но не перезаписываются немедленно. Если программа вызывается вновь и страницы к тому времени не перезаписаны, код переиспользуется.

VIT ★★★
()

А в используемой среде есть возможность прилинковать статически собранную glib и через FFI вызвать g_file_trash?

Очень много языков используют glib через FFI, поскольку современный glib на него сильно заточен (есть все нуюные для автогенерации байндигов всдругие языки метаданные)

GPFault ★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария