You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

103 lines
3.4 KiB

#!/usr/bin/env python
"""
Functions to check if the path filesystem uses FAT
"""
import sys
import os
debug = False
def isFAT(dir):
# Check if "dir" is on FAT. FAT considered harmful (for big files)
# Works for Linux, Windows, MacOS
# NB: On Windows, full path with drive letter is needed!
FAT = False # default: not FAT
# We're dealing with OS calls, so put everything in a try/except, just in case:
try:
if 'linux' in sys.platform:
# On Linux:
# df -T /home/sander/weg
'''
Example output of a 500GB external USB drive formatted with FAT:
$ df -T /media/sander/INTENSO
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/sda1 vfat 488263616 163545248 324718368 34% /media/sander/INTENSO
'''
cmd = "df -T " + dir + " 2>&1"
for thisline in os.popen(cmd).readlines():
#print thisline
if thisline.find('/') == 0:
# Starts with /, so a real, local device
fstype = thisline.split()[1]
if debug: print(("File system type:", fstype))
if fstype.lower().find('fat') >= 0:
FAT = True
if debug: print("FAT found")
break
elif 'win32' in sys.platform:
import win32api
if '?' in dir:
# Remove \\?\ or \\?\UNC\ prefix from Windows path
dir = dir.replace('\\\\?\\UNC\\', '\\\\', 1).replace('\\\\?\\', '', 1)
try:
result = win32api.GetVolumeInformation(os.path.splitdrive(dir)[0])
if debug: print(result)
if(result[4].startswith("FAT")):
FAT = True
except:
pass
elif 'darwin' in sys.platform:
# MacOS formerly known as OSX
'''
MacOS needs a two-step approach:
# First: directory => device
server:~ sander$ df /Volumes/CARTUNES/Tuna/
Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on
/dev/disk9s1 120815744 108840000 11975744 91% 0 0 100% /Volumes/CARTUNES
# Then: device => filesystem type
server:~ sander$ mount | grep /dev/disk9s1
/dev/disk9s1 on /Volumes/CARTUNES (msdos, local, nodev, nosuid, noowners)
'''
dfcmd = "df " + dir
for thisline in os.popen(dfcmd).readlines():
if thisline.find('/')==0:
if debug: print(thisline)
# Starts with /, so a real, local device
device = thisline.split()[0]
mountcmd = "mount | grep " + device
mountoutput = os.popen(mountcmd).readline().strip()
if debug: print(mountoutput)
if 'msdos' in mountoutput.split('(')[1]:
FAT = True
break
except:
pass
return FAT
if __name__ == "__main__":
if debug: print((sys.platform))
try:
dir = sys.argv[1]
except:
print("Specify dir on the command line")
sys.exit(0)
if isFAT(dir):
print((dir, "is on FAT"))
else:
print((dir, "is not on FAT"))