Ответа Джейсона Р. Кумбса достаточно для Windows. И большинство файловых менеджеров POSIX GUI / открытых диалогов / и т.д. вероятно, следует тому же соглашению "точка-префикс-значит-скрыто", что и ls
. Но не Mac OS X.
Существует как минимум четыре способа скрыть файл или каталог в Finder, панелях открытия файлов и т. Д.:
- Префикс точки.
- HFS + невидимый атрибут.
- Флаг поиска информации скрыт.
- Соответствует специальному черному списку, встроенному в CoreFoundation (который отличается в каждой версии ОС - например,
~/Library
скрыт в 10.7+, но не в 10.6).
Попытка написать собственный код для обработки всего этого не будет легкой. И вам придется поддерживать его в актуальном состоянии, так как я готов держать пари, что черный список будет меняться с большинством версий ОС, в итоге Finder Info перейдет от устаревшего к полностью неподдерживаемому, расширенные атрибуты могут поддерживаться более широко, чем HFS + ,…
Но если вам может потребоваться pyobjc
(который уже включен в недавний Python от Apple и может быть установлен через pip
в противном случае), вы можете просто вызвать код Apple:
import Foundation
def is_hidden(path):
url = Foundation.NSURL.fileURLWithPath_(path)
return url.getResourceValue_forKey_error_(None, Foundation.NSURLIsHiddenKey, None)[0]
def listdir_skipping_hidden(path):
url = Foundation.NSURL.fileURLWithPath_(path)
fm = Foundation.NSFileManager.defaultManager()
urls = fm.contentsOfDirectoryAtURL_includingPropertiesForKeys_options_error_(
url, [], Foundation.NSDirectoryEnumerationSkipsHiddenFiles, None)[0]
return [u.path() for u in urls]
Это должно работать на любом Python, который поддерживает pyobjc, на OS X 10.6+. Если вы хотите 10.5 или более раннюю версию, флаги перечисления каталога еще не существовали, поэтому единственная опция - это что-то вроде фильтрации чего-то вроде contentsOfDirectoryAtPath_error_
(или просто os.listdir
) на is_hidden
.
Если вам нужно обойтись без pyobjc
, вы можете перейти к CoreFoundation
эквивалентам и использовать ctypes
. Ключевыми функциями являются CFURLCopyResourcePropertyForKey
для is_hidden
и CFURLEnumeratorCreateForDirectoryURL
для отображения каталога.
См. http://pastebin.com/aCUwTumB для реализации.
Я проверял с:
- OS X 10.6, 32-битный python.org 3.3.0
- OS X 10.8, 32-разрядная версия Apple 2.7.2
- OS X 10.8, 64-разрядная версия Apple 2.7.2
- OS X 10.8, 64-битный python.org 3.3.0
Он работает соответствующим образом на каждом (например, он пропускает ~/Library
на 10,8, но показывает на 10,6).
Это должно работать на любой OS X 10.6+ и любом Python 2.6+. Если вам нужна OS X 10.5, вам нужно использовать старые API (или os.listdir
) и фильтровать по is_hidden
. Если вам нужен Python 2.5, измените bytes
проверки на str
проверки (что, конечно, ломает 3.x) и with
на уродливые try
/ finally
или ручное освобождение.
Если кто-то планирует поместить этот код в библиотеку, я настоятельно рекомендую сначала проверить pyobjc
(import Foundation
и, если вы не получите ImportError
, вы выиграете), и использовать только ctypes
код, если он недоступен.
Последнее примечание:
Некоторые люди, ищущие этот ответ, пытаются изобрести колесо, которое им не нужно.
Часто, когда люди делают что-то подобное, они создают графический интерфейс и хотят, например, показать файловые браузеры с возможностью скрыть или показать скрытые файлы. Многие популярные кроссплатформенные графические инфраструктуры (Qt, wx и т. Д.) Имеют встроенную поддержку. (Кроме того, многие из них имеют открытый исходный код, поэтому вы можете прочитать их код, чтобы узнать, как они это делают.)
Это может не отвечать на ваш вопрос - например, они могут просто передавать флаг «фильтровать скрытые файлы» в диалоговое окно браузера файлов на платформе, но вы пытаетесь создать файловый браузер в консольном режиме и можете ' сделать это. Но если это так, просто используйте его.