创建文件名时,冒号(:)显示为正斜杠(/)

时间:2012-11-08 21:51:16

标签: ruby macos

我使用日期和时间标记我正在创建的新文件,但是当我查看文件时,冒号是正斜杠。我正在使用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

2 个答案:

答案 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 #1392notes on specifying paths in AppleScript

(还有一些其他差异。如果unix路径以分隔符(“/”)开头,则unix路径是绝对的,绝对路径从根卷的顶部开始。如果它是不以分隔符开头,绝对OS 9路径以卷名开头。因此,unix路径“/ tmp / foo:bar”相当于OS 9路径“Macintosh HD:tmp :富/栏”)

那么,文件名中的哪个字符真的,斜杠或冒号?好吧,文件名是一个相当抽象的东西,但如果你问的是实际存储在磁盘上的字节...如果它是在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,请尝试使用“转到文件夹”进行操作:

  • 输入“/ tmp / foo:bar”。
  • 输入“/ tmp / fo”然后按Tab键将其自动填充到“/ tmp / foo / bar /”,这有效。
  • 输入“/ tmp / foo / bar /”失败,即使它与自动完成完全相同。
  • 输入“/ tmp / foo”,然后按Tab键自动填充到“/ tmp / foo /”,这不能再自动完成,根本不起作用。

更新:正如Konrad Rudolph所指出的那样,Go Cap文件夹的行为自El Capitan开始发生变化,我不再有任何方法可以使用它来获取包含有争议角色的文件夹。