我使用日期和时间标记我正在创建的新文件,但是当我查看文件时,冒号是正斜杠。我正在使用10.7 +
在Mac上进行开发以下是我正在使用的代码:
File.open("#{time.hour} : 00, #{time.month}-#{time.day}-#{time.year}", "a") do |mFile|
mFile.syswrite("#{pKey} - #{tKey}: \n")
mFile.syswrite("Items closed: #{itemsClosed} | Total items: #{totalItems} | Percent closed: % #{pClosed} \n")
mFile.syswrite("\n")
mFile.close
end
这是输出(假设时间是下午1点):
13 / 00, 11-8-2012
为什么会发生这种情况,我该如何解决?我希望输出为:
13:00, 11-8-2012
答案 0 :(得分:31)
曾几何时,在Mac OS X之前,:
是目录分隔符而不是/
。显然OS X 10.7仍在尝试修复这样的程序。如果你真的需要:
在那里,我不知道如何解决这个问题。我省略了: - )。
编辑:经过多次搜索this USENIX paper描述了正在发生的事情。他们明显使用的规则是:
另一个明显的问题是HFS +(冒号,':')和UFS之间的不同路径分隔符 (斜线,'/')。这也意味着HFS +文件名可能包含斜杠字符,而不是 冒号,而UFS文件名则相反。尽管如此,这很容易解决 涉及来回转换字符串。内核VFS中的HFS +实现 在读取和写入磁盘时,layer将冒号转换为斜杠,反之亦然 格式。所以在磁盘上,分隔符是一个冒号,但是在VFS层(因此是任何东西 在它和内核之上,比如libc)它是一个斜杠。但是,传统的Mac OS 工具包期望冒号,因此在BSD层之上,核心碳工具包还有另一个 翻译。结果是Carbon应用程序看到了冒号,而其他人都看到了冒号 斜杠。在罕见的文件名中,这可以创建用户可见的精神分裂症 包含冒号字符,在Carbon应用程序中显示为斜线字符,但是 以BSD程序和Cocoa应用程序作为冒号。
答案 1 :(得分:13)
虽然OS X“是”unix操作系统,但它也从Mac OS 9中获得了相当多的代码,API,标准等。在unix中,文件路径有“/”分隔元素,“:”是允许在单个文件和目录的名称中。在Mac OS 9中,它是另一种方式:文件路径在元素之间有“:”,而在单个文件名中允许“/”。当Apple开发OS X时,他们不得不支持一些使用unix风格文件路径的API,以及一些使用OS 9风格路径的API,他们必须能够在同一个文件系统上工作。
他们所做的是交换分隔符并根据上下文允许字符。如果您编写(/运行)使用unix API访问文件系统的程序,您将看到名称中包含冒号的文件和分隔路径元素的斜杠。如果您编写(/运行)使用旧OS 9 API(或其衍生产品)的程序,您将看到名称和冒号分隔路径元素的斜杠文件。有关详细讨论,请参阅Apple's developer Q&A #1392和notes on specifying paths in AppleScript。
(还有一些其他差异。如果unix路径以分隔符(“/”)开头,则unix路径是绝对的,绝对路径从根卷的顶部开始。如果它是
那么,文件名中的哪个字符真的,斜杠或冒号?好吧,文件名是一个相当抽象的东西,但如果你问的是实际存储在磁盘上的字节...如果它是在HFS +(又名Mac OS Extended)卷上,那么它存储在一个文件系统中设计用于OS 9(以及技术上的Mac OS 8.1)API,因此它允许斜线但禁止冒号,因此在HFS +卷上文件将“真正”在名称中有一个斜杠。 OTOH如果你将文件存储在unixish卷上,它将使用unix约定存储,并且“真的”在名称中有一个冒号。但除非您从磁盘读取原始字节或编写文件系统驱动程序,否则差异并不重要......
最后,为什么Finder会将有争议的文件名字符显示为斜线而不是冒号?我很确定它主要是惯性。 Finder甚至没有完全一致,因为如果你使用它的Go To Folder选项(Command-Shift-G)并输入“/ Users / Shared”,它会将其视为unix路径。如果您输入“Macintosh HD:Users:Shared”,它不知道您在说什么。此外,如果您运行touch /tmp/foo:bar
,请尝试使用“转到文件夹”进行操作:
更新:正如Konrad Rudolph所指出的那样,Go Cap文件夹的行为自El Capitan开始发生变化,我不再有任何方法可以使用它来获取包含有争议角色的文件夹。