Python IOError 102 on os.listdir()

590 views Asked by At

I made a script that will map me a directory and give me stats about it ... Here's the script:

import os 
import hashlib
import platform
import sys
import argparse
import HTML

class Map(object):

    def __init__(self,param):
        self.param_list = param
        self.slash = self.slash_by_os()
        self.result_list = []
        self.os = ""


    def calc_md5(self,file_path):
        with open(file_path) as file_to_check:
            data = file_to_check.read()    
            md5_returned = hashlib.md5(data).hexdigest()

        return md5_returned

    def slash_by_os(self):
        general_id = platform.system()
        actual_os = ""

        if general_id == "Darwin" or general_id == "darwin":
            actual_os = "UNIX"
        elif general_id == "Linux" or general_id == "linux":
            actual_os = "UNIX"
        elif general_id  == "SunOS":
            actual_os = "UNIX"
        elif general_id == "Windows" or general_id == "windows":
            actual_os = "WIN"
        else:
            actual_os = general_id

        if actual_os == "UNIX":
            return '/'
        elif actual_os == "WIN":
            return '\\'
        else:
            return '/'

        self.os = actual_os

    def what_to_do(self,new_dir):
        act = []
        act.append(new_dir[:-1])
        for param in self.param_list:
            if param == "md5":
                x = self.calc_md5(new_dir[:-1])
                act.append(x)
            elif param == "size":
                x = os.stat(new_dir[:-1]).st_size
                act.append(x)
            elif param == "access":
                x = os.stat(new_dir[:-1]).st_atime
                act.append(x)
            elif param == "modify":
                x = os.stat(new_dir[:-1]).st_mtime
                act.append(x)
            elif param == "creation":
                    x = os.stat(new_dir[:-1]).st_ctime
                    act.append(x)   

        return act

    def list_of_files(self ,dir_name ,traversed = [], results = []): 

        dirs = os.listdir(dir_name)
        if dirs:
            for f in dirs:
                new_dir = dir_name + f + self.slash
                if os.path.isdir(new_dir) and new_dir not in traversed:
                    traversed.append(new_dir)
                    self.list_of_files(new_dir, traversed, results)
                else:
                    act = self.what_to_do(new_dir)
                    results.append(act)
        self.result_list = results  
        return results


def parse_args():
    desc = "Welcom To dirmap.py 1.0"
    parser = argparse.ArgumentParser(description=desc)
    parser.add_argument('-p','--path', help='Path To Original Directory', required=True)
    parser.add_argument('-md','--md5', action = 'store_true',help='Show md5 hash of file', required=False)
    parser.add_argument('-s','--size', action = 'store_true', help='Show size of file', required=False)
    parser.add_argument('-a','--access', action = 'store_true',  help='Show access time of file', required=False)
    parser.add_argument('-m','--modify', action = 'store_true', help='Show modification time of file', required=False)
    parser.add_argument('-c','--creation', action = 'store_true', help='Show creation of file', required=False)

    args = vars(parser.parse_args())

    params = []
    for key,value in args.iteritems():
        if value == True:
            params.append(key)

    return args,params



def main():
    args , params = parse_args() 
    dir_path = args['path']
    map = Map(params)
    dir_list = map.list_of_files(dir_path)

    params.insert(0,"path")


    htmlcode_dir = HTML.table(dir_list,header_row=params)
    print htmlcode_dir

main()

and while running on linux env i get this traceback:

MacBook-Pro:Python Scripts Daniel$ python dirmap.py -p / -md -s -a -m -c >> 1.html Traceback (most recent call last): File "dirmap.py", line 132, in main() File "dirmap.py", line 124, in main dir_list = map.list_of_files(dir_path) File "dirmap.py", line 89, in list_of_files act = self.what_to_do(new_dir) File "dirmap.py", line 61, in what_to_do x = self.calc_md5(new_dir[:-1]) File "dirmap.py", line 25, in calc_md5 with open(file_path, 'rb') as file_to_check: IOError: [Errno 102] Operation not supported on socket: '/.dbfseventsd'

How could I fix my problem?? Thanks !

1

There are 1 answers

0
Windward Geek On BEST ANSWER

The problem is when open() runs over sockets when it scans various files. You should be able to solve this with a try/catch, by catching IOError. Example:

try:
    with open(file_path) as file_to_check:
        data = file_to_check.read()    
        md5_returned = hashlib.md5(data).hexdigest()
except IOError as ioe:
    print "Failed: " + str(ioe)

But this will catch ALL io errors, not just sockets. If you want an error message that handles this specific scenario, you need to check if this is a socket before you try to open it. See this for how to check if a file is a socket.

Also, I noticed you were manually checking the platform for which file separator to use. It's builtin as 'os.path.sep'. Check out the python os.path module for more platform independent ways to traverse filesystems.