forked from actlaboratory/falcon
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fileSystemManager.py
141 lines (112 loc) · 4.29 KB
/
fileSystemManager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# -*- coding: utf-8 -*-
#Falcon file system objects
#Copyright (C) 2019 Yukio Nozawa <[email protected]>
#Copyright (C) 2020 yamahubuki <[email protected]>
#Note: All comments except these top lines will be written in Japanese.
import win32api
import re
import os
from enum import Enum
def GetFileSystemObject(letter):
"""
ドライブレターから、そのドライブのファイルシステムを取得する。
:param letter: ドライブレター1文字。
:type letter: str
:rtype: FileSystemBase
"""
name=win32api.GetVolumeInformation("%s:\\" % (letter[0]))[4]
try:
cls=globals()[name]
except KeyError:
return None
#end keyError
return cls()
def ValidationObjectName(path,pathType,path2=""):
"""
ファイルやディレクトリの名前pathに何らかの問題があればその内容を返す
pathは原則フルパス
typeはpathTypeから1つを指定
ボリュームラベル変更などでpathがドライブ名を含まない場合、path2でドライブ名を指定
"""
s=os.path.split(path)[1]
#使用できない文字の確認
ngString=[]
for c in ("\\","/",":","*","?","\"","<",">","|"):
if c in s:
ngString.append(c)
if ngString:
tmp=""
for c in ngString:
if tmp!="":
tmp+=" ・ "
tmp+="「"+c+"」"
tmp+=_("は、ファイルやディレクトリの名前として使用できない記号です。")
return tmp
#使用できない特別な名前
for i in ("CON","AUX","PRN","NUL"):
if re.sub("^("+i+"$)|("+i+"\\..*)",r"",s.upper())=="":
return _("この文字列は、Windowsによって予約された特別な名前のため、ファイルやディレクトリの名前として使用できません。")
for i in ("COM","LPT"):
if re.sub("^("+i+"[1-9]$)|("+i+"[1-9]\\..*)",r"",s.upper())=="":
return _("この文字列は、Windowsによって予約された特別な名前のため、ファイルやディレクトリの名前として使用できません。")
#末尾が.と半角スペースでないことの確認
if re.sub("(.*\\.$)|(.* $)",r"",s.upper())=="":
return _("名前の最後を半角の.(ピリオド)または半角スペースとすることはできません。")
#パス長の確認
if pathType==pathTypes.VOLUME_LABEL:
drive=GetFileSystemObject(os.path.splitdrive(path2)[0])
#TODO
else:
drive=GetFileSystemObject(os.path.splitdrive(path)[0])
if len(s)>drive.MAX_PATH_LENGTH:
return _("このドライブでは、以下の文字数を超えない名前を付ける必要があります。\n\n制限文字数:"+str(drive.MAX_PATH_LENGTH))
if pathType==pathTypes.DIRECTORY:
if len(path)>drive.MAX_DIRECTORY_PATH_LENGTH:
return _("このドライブでは、ディレクトリ名のフルパスが以下の文字数を超えないように名前を付ける必要があります。\n\n制限文字数:"+str(drive.MAX_DIRECTORY_PATH_LENGTH))
elif pathType==pathTypes.FILE:
if len(path)>drive.MAX_FULLPATH_LENGTH:
return _("このドライブでは、ファイル名のフルパスが以下の文字数を超えないように名前を付ける必要があります。\n\n制限文字数:"+str(drive.MAX_FULLPATH_LENGTH))
#問題なし
return ""
class pathTypes(Enum):
DIRECTORY=0
FILE=1
VOLUME_LABEL=2
class limitTypes(Enum):
CHAR=0
BYTE=1
class FileSystemBase(object):
def __init__(self):
self.canMakeHardLink=True
self.canMakeSymbolicLink=True
MAX_PATH_LENGTH=255
MAX_DIRECTORY_PATH_LENGTH=247
MAX_FULLPATH_LENGTH=259
class NTFS(FileSystemBase):
def __str__(self):
return "NTFS"
MAX_VOLUME_LABEL_TYPE=limitTypes.CHAR
MAX_VOLUME_LABEL_LENGTH=32
class FAT(FileSystemBase):
def __str__(self):
return "FAT"
MAX_VOLUME_LABEL_TYPE=limitTypes.BYTE
MAX_VOLUME_LABEL_LENGTH=11
class FAT32(FileSystemBase):
def __str__(self):
return "FAT32"
MAX_VOLUME_LABEL_TYPE=limitTypes.BYTE
MAX_VOLUME_LABEL_LENGTH=11
class exFAT(FileSystemBase):
def __str__(self):
return "exFAT"
MAX_VOLUME_LABEL_TYPE=limitTypes.BYTE
MAX_VOLUME_LABEL_LENGTH=11
class UDF(FileSystemBase):
def __str__(self):
return "UDF"
MAX_VOLUME_LABEL_TYPE=limitTypes.CHAR
MAX_VOLUME_LABEL_LENGTH=32
class CDFS(FileSystemBase):
def __str__(self):
return "CDFS"