Skip to content

Instantly share code, notes, and snippets.

@mherrmann
Created October 5, 2016 08:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mherrmann/a977536068fbc914870e97b0ee1cbb08 to your computer and use it in GitHub Desktop.
Save mherrmann/a977536068fbc914870e97b0ee1cbb08 to your computer and use it in GitHub Desktop.
Determine if a file is hidden on OS X
from ctypes import CFUNCTYPE, POINTER, c_uint8, c_void_p, c_long, addressof, \
byref, CDLL, cdll, c_char_p
from ctypes.util import find_library
def is_hidden(path):
if not isinstance(path, bytes):
path = path.encode('utf-8')
with AutoRelease() as autorelease:
url = autorelease(CFURLCreateFromFileSystemRepresentation(
None, path, len(path), False
))
val = c_void_p(0)
err = CFError()
ret = CFURLCopyResourcePropertyForKey(
url, kCFURLIsHiddenKey, addressof(val), byref(err)
)
if ret:
autorelease(val)
return bool(CFBooleanGetValue(val))
else:
raise OSError(
'CFURLCopyResourcePropertyForKey failed with error %d' %
CFErrorGetCode(err)
)
class AutoRelease:
def __init__(self):
self.to_release = []
self.pool = None
def __enter__(self):
self.pool = \
objc.objc_msgSend(NSAutoreleasePool, objc.sel_registerName('alloc'))
self.pool = objc.objc_msgSend(self.pool, objc.sel_registerName('init'))
return self
def __call__(self, obj_to_release):
self.to_release.append(obj_to_release)
return obj_to_release
def __exit__(self, *_):
for obj in self.to_release:
CFRelease(obj)
objc.objc_msgSend(self.pool, objc.sel_registerName('drain'))
CoreFoundation = CDLL(find_library('CoreFoundation'))
Foundation = CDLL(find_library('Foundation'))
objc = cdll.LoadLibrary(find_library('objc'))
Boolean = c_uint8
CFTypeRef = c_void_p
CFIndex = c_long
CFString = CFTypeRef
CFURL = CFTypeRef
CFError = CFTypeRef
CFErrorRef = POINTER(CFError)
CFRelease = CFUNCTYPE(None, CFTypeRef)(('CFRelease', Foundation))
NSAutoreleasePool = objc.objc_getClass('NSAutoreleasePool')
CFURLCreateFromFileSystemRepresentation = \
CFUNCTYPE(CFURL, c_void_p, c_char_p, CFIndex, Boolean)\
(('CFURLCreateFromFileSystemRepresentation', CoreFoundation))
CFURLCopyResourcePropertyForKey = \
CFUNCTYPE(Boolean, CFURL, CFString, c_void_p, CFErrorRef)\
(('CFURLCopyResourcePropertyForKey', CoreFoundation))
CFBooleanGetValue = \
CFUNCTYPE(Boolean, c_void_p)\
(('CFBooleanGetValue', CoreFoundation))
CFErrorGetCode = \
CFUNCTYPE(CFIndex, CFError)\
(('CFErrorGetCode', CoreFoundation))
kCFURLIsHiddenKey = CFString.in_dll(CoreFoundation, 'kCFURLIsHiddenKey')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment