• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""
2Path operations common to more than one OS
3Do not use directly.  The OS specific modules import the appropriate
4functions from this module themselves.
5"""
6import os
7import stat
8
9__all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime',
10           'getsize', 'isdir', 'isfile']
11
12
13try:
14    _unicode = unicode
15except NameError:
16    # If Python is built without Unicode support, the unicode type
17    # will not exist. Fake one.
18    class _unicode(object):
19        pass
20
21# Does a path exist?
22# This is false for dangling symbolic links on systems that support them.
23def exists(path):
24    """Test whether a path exists.  Returns False for broken symbolic links"""
25    try:
26        os.stat(path)
27    except os.error:
28        return False
29    return True
30
31
32# This follows symbolic links, so both islink() and isdir() can be true
33# for the same path on systems that support symlinks
34def isfile(path):
35    """Test whether a path is a regular file"""
36    try:
37        st = os.stat(path)
38    except os.error:
39        return False
40    return stat.S_ISREG(st.st_mode)
41
42
43# Is a path a directory?
44# This follows symbolic links, so both islink() and isdir()
45# can be true for the same path on systems that support symlinks
46def isdir(s):
47    """Return true if the pathname refers to an existing directory."""
48    try:
49        st = os.stat(s)
50    except os.error:
51        return False
52    return stat.S_ISDIR(st.st_mode)
53
54
55def getsize(filename):
56    """Return the size of a file, reported by os.stat()."""
57    return os.stat(filename).st_size
58
59
60def getmtime(filename):
61    """Return the last modification time of a file, reported by os.stat()."""
62    return os.stat(filename).st_mtime
63
64
65def getatime(filename):
66    """Return the last access time of a file, reported by os.stat()."""
67    return os.stat(filename).st_atime
68
69
70def getctime(filename):
71    """Return the metadata change time of a file, reported by os.stat()."""
72    return os.stat(filename).st_ctime
73
74
75# Return the longest prefix of all list elements.
76def commonprefix(m):
77    "Given a list of pathnames, returns the longest common leading component"
78    if not m: return ''
79    s1 = min(m)
80    s2 = max(m)
81    for i, c in enumerate(s1):
82        if c != s2[i]:
83            return s1[:i]
84    return s1
85
86# Split a path in root and extension.
87# The extension is everything starting at the last dot in the last
88# pathname component; the root is everything before that.
89# It is always true that root + ext == p.
90
91# Generic implementation of splitext, to be parametrized with
92# the separators
93def _splitext(p, sep, altsep, extsep):
94    """Split the extension from a pathname.
95
96    Extension is everything from the last dot to the end, ignoring
97    leading dots.  Returns "(root, ext)"; ext may be empty."""
98
99    sepIndex = p.rfind(sep)
100    if altsep:
101        altsepIndex = p.rfind(altsep)
102        sepIndex = max(sepIndex, altsepIndex)
103
104    dotIndex = p.rfind(extsep)
105    if dotIndex > sepIndex:
106        # skip all leading dots
107        filenameIndex = sepIndex + 1
108        while filenameIndex < dotIndex:
109            if p[filenameIndex] != extsep:
110                return p[:dotIndex], p[dotIndex:]
111            filenameIndex += 1
112
113    return p, ''
114