我想不出一个操作系统(Linux,Windows,Unix)会引起问题,但是也许有人可以告诉我这种方法是否不受欢迎。
我想使用base64编码的字符串作为文件名。类似于class MainApplication(tk.Tk):
def __init__(self, master, *args, **kwargs):
tk.Frame.__init__(self, master)
self.master = master
self.shared_data = {"listbox1": []}
self.container = tk.Frame(self)
self.container.pack(side="top", fill="both", expand=True)
self.container.grid_rowconfigure(0, weight=1)
self.container.grid_columnconfigure(0, weight=1)
self.frames = {}
self.frames["A"] = A(master=self.container, controller=self)
self.frames["B"] = B(master=self.container, controller=self)
self.top_frame = Frame(master)
self.top_frame.pack(side=TOP, expand=True)
self.bottom_frame = Frame(master)
self.bottom_frame.pack(side=BOTTOM, expand=True)
self.left_frame = Frame(self.bottom_frame)
self.left_frame.pack(side=LEFT, expand=True)
self.right_frame = Frame(self.bottom_frame)
self.right_frame.pack(side=RIGHT, expand=True)
self.A = A(self.top_frame, controller=self)
self.B = B(self.left_frame, controller=self)
def get_page(self, c):
return self.frames[c]
class A(tk.Frame):
def __init__(self, master, controller):
tk.Frame.__init__(self, master)
self.master = master
self.controller = controller
self.Buttonfont = tkFont.Font(family="arial", size=15, weight=tkFont.BOLD)
self.frame = Frame(self.master)
self.frame.pack()
self.master.openfile = Button(self.frame, text="Open File", font=self.Buttonfont, command=lambda:[self.import_dataframe(), self.refresh_B()])
self.master.openfile.pack(side=TOP)
def import_dataframe(self):
#with pandas:
#self.filename = filedialog.askopenfilename(initialdir="/", title="Select File", filetypes=(("Comma Separated Values", "*.csv"), ("Excelsheet","*.xlsx")))
#df = pd.read_csv(self.filename, index_col = 0)
#self.controller.shared_data["listbox1"] = df.columns.to_list()
#without pandas:
self.controller.shared_data["listbox1"] = ["item1", "item2"]
def refresh_B(self):
self.controller.B.listbox.destroy()
self.controller.B.listbox = Listbox(self.controller.B.listframe, height=30, width=50)
self.controller.B.listbox.pack()
for i in self.controller.shared_data["listbox1"]:
self.controller.B.listbox.insert(END, i)
class B(tk.Frame):
def __init__(self, master, controller):
tk.Frame.__init__(self, master)
self.master = master
self.controller = controller
self.listframe = Frame(self.master)
self.listframe.pack(side=TOP, fill="both")
self.listbox = Listbox(self.listframe, height=30, width=50)
self.listbox.pack(side=TOP)
。这有可能在任何地方引起问题吗?
编辑:我可能最多将其保留24个字符
编辑:看来我的角色会引起问题。生成字符串的函数正在提供类似以下的字符串:gH9JZDP3+UEXeZz3+ng7Lw==
您会注意到它有一个J2db3/pULejEdNiB+wZRow==
,它将引起问题。
根据this site,/
是有效的base64字符,因此我将无法使用base64编码的字符串作为文件名。
答案 0 :(得分:1)
不。您不能使用base64
编码的字符串作为文件名。这是因为/
字符对base64
字符串有效,这将导致文件系统出现问题。
https://base64.guru/learn/base64-characters
替代项:
您可以使用base64
然后替换不需要的字符,但是更好的选择是使用bin2hex()
之类的函数对原始字符串进行十六进制编码。
答案 1 :(得分:0)
官方RFC 4648声明:
已建议使用替代字母,该字母将“〜”用作第63个字符。由于“〜”字符在某些文件系统环境中具有特殊含义,因此建议改用本节中描述的编码。剩余的未保留URI字符为“。”,但是某些文件系统环境不允许使用多个“。”。在文件名中,因此为“。”角色也没有吸引力。
我还在this发现的serverfault stackexchange上找到了
没有“ Unix”文件系统之类的东西。也没有“ Windows”文件系统。您是指NTFS,FAT16,FAT32,ext2,ext3,ext4等。名称中的每个有效字符都有各自的限制。
此外,您的问题标题和问题涉及两个完全不同的概念?您是否想知道合法字符的子集,还是想在两种系统中都可以使用哪些通配符?
http://en.wikipedia.org/wiki/Ext3指出“文件名中允许使用除NULL和'/'以外的所有字节”。
http://msdn.microsoft.com/zh-cn/library/aa365247(VS.85).aspx描述了有效文件名的通用情况,而与文件系统无关。特别是,以下字符保留<>:“ / \ |?*
Windows还对不使用文件名的设备设置了限制:CON,PRN,AUX,NUL,COM1,COM2,COM3等。
基于Windows和Unix的操作系统中的大多数命令都接受*作为通配符。 Windows接受%作为单个字符通配符,而Unix系统的shell使用?作为单个字符通配符。
Base64仅包含A–Z,a–z,0–9,+,/和=。因此,不使用的字符列表为:所有可能的字符减去上述字符。
出于特殊目的。和_也可以。
这意味着应该使用/
或_
而不是标准的.
base64字符;在UNIX和Windows上都可以。
许多编程语言都允许您将所有/
替换为_
或.
,因为它只是单个字符,并且可以通过简单的循环来完成。
答案 2 :(得分:-1)
在Windows中,只要符合Windows的命名约定,就可以了: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions。
据我所知,任何base64编码的字符串都不包含任何保留字符。
可能会出现问题的是文件名过长。