33

作成中の新しいファイルに日付と時刻を使用してラベルを付けていますが、ファイルを表示するとコロンがスラッシュになっています。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
4

3 に答える 3

50

昔々、Mac OS X以前:は、の代わりにディレクトリセパレータがあり/ました。どうやらOSX10.7はまだそのようなプログラムを修正しようとしています。本当にそこにいる必要があるのなら、どうすればこれを修正できるのかわかりません:。私はそれを省略します:-)。

編集:もう少し検索した後、このUSENIXペーパーは何が起こっているかを説明します。彼らが使用しているルールは明らかにこれです:

もう1つの明らかな問題は、HFS +(コロン、':')とUFS(スラッシュ、'/')のパスセパレータが異なることです。これは、HFS +ファイル名にコロンではなくスラッシュ文字が含まれている可能性があることも意味しますが、UFSファイル名にはその逆が当てはまります。これは、文字列を前後に変換する必要がありますが、簡単に対処できました。カーネルのVFSレイヤーのHFS+実装は、ディスク上のフォーマットからの読み取りおよびディスクフォーマットへの書き込み時に、コロンをスラッシュに、またはその逆に変換します。したがって、ディスク上ではセパレーターはコロンですが、VFSレイヤー(したがって、その上にあるものとlibcなどのカーネル)ではスラッシュになります。ただし、従来のMac OSツールキットはコロンを想定しているため、BSDレイヤーの上では、コアのCarbonツールキットがさらに別の変換を行います。その結果、Carbonアプリケーションにはコロンが表示され、他のすべてのアプリケーションにはスラッシュが表示されます。

于 2012-11-08T21:54:09.277 に答える
17

OS X は「UNIX オペレーティング システム」ですが、そのコード、API、標準なども Mac OS 9 からかなりの部分を派生させています。UNIX では、ファイル パスには要素を区切る「/」があり、「:」を使用できます。個々のファイルとディレクトリの名前。Mac OS 9 では逆で、ファイル パスの要素間に「:」があり、個々のファイル名で「/」が許可されていました。Apple が OS X を開発したとき、UNIX スタイルのファイル パスを使用する一部の API と、OS 9 スタイルのパスを使用する一部の API をサポートする必要があり、両方が同じファイル システムで動作できる必要がありました。

彼らがしたことは、コンテキストに応じて区切り文字と許可された文字を交換することです。UNIX API を使用してファイルシステムにアクセスするプログラムを作成 (/実行) すると、名前にコロンが含まれ、パス要素がスラッシュで区切られているファイルが表示されます。古い OS 9 API (またはその派生物) を使用するプログラムを作成 (/実行) すると、名前にスラッシュが含まれ、パス要素がコロンで区切られているファイルが表示されます。もう少し議論が必要な場合は、Apple の開発者向け Q&A #1392、AppleScript でのパスの指定に関する注意事項を参照してください。

(他にもいくつかの違いがあります。UNIX パスは、区切り文字 ("/") で始まる場合は絶対パスであり、絶対パスはルート ボリュームの先頭から始まります。OS 9 パスは、開始しない場合は絶対パスです。 OS 9 の絶対パスはボリューム名で始まります. したがって、UNIX パス "/tmp/foo:bar" は OS 9 パス "Macintosh HD:tmp:foo/bar" と同等です.)

では、実際にファイル名に含まれている文字は、スラッシュかコロンか? ファイル名はかなり抽象的なものですが、ディスクに実際に保存されているバイト数について質問している場合は... HFS+ (別名 Mac OS 拡張) ボリューム上にある場合、ファイルシステムに保存されています。 OS 9 (技術的には Mac OS 8.1) API で動作するように設計されているため、スラッシュは許可されますが、コロンは禁止されます。したがって、HFS+ ボリュームでは、ファイルの名前に「実際に」スラッシュが含まれます。OTOH ファイルを unixish ボリュームに保存すると、unix 規則を使用して保存され、「実際には」名前にコロンが含まれます。ただし、ディスクから生のバイトを読み取ったり、ファイルシステムドライバーを作成したりしない限り、違いは実際には問題になりません...

最後に、なぜ Finder は物議を醸しているファイル名の文字をコロンではなくスラッシュで表示するのですか? 私はそれがほとんど慣性であると確信しています。Go To Folder オプション (Command-Shift-G) を使用して「/Users/Shared」と入力すると、Finder はそれを UNIX パスとして処理するため、Finder はこれについて完全に一貫していません。「Macintosh HD:Users:Shared」と入力しても、何を言っているのかわかりません。さらに、 を実行する場合はtouch /tmp/foo:bar、[フォルダへ移動] でアクセスしてみてください:

  • 「/tmp/foo:bar」と入力すると機能します。
  • 「/tmp/fo」と入力してタブを押すと、「/tmp/foo/bar/」にオートコンプリートされ、機能します。
  • オートコンプリートとまったく同じですが、「/tmp/foo/bar/」と入力すると失敗します。
  • 「/tmp/foo」と入力してタブを押すと、「/tmp/foo/」にオートコンプリートされます。これ以上オートコンプリートできず、まったく機能しません。

更新: Konrad Rudolph が指摘したように、Go To Folder の動作は El Capitan の時点で変更されており、物議を醸しているキャラクターを含むフォルダーに移動するためにそれを使用する方法はもうありません。

于 2012-11-09T21:46:51.533 に答える
4

ファイル名、パス、およびさまざまな OSを処理するときにできるだけ多くの問題を回避するには、、、、、、などの組み込みのファイルメソッドを実際に利用する必要があります。彼らはシステムの依存関係を回避しようとし、クロスプラットフォームで有効なファイル名を生成するプログラムによる方法を提供しようとします。joindirnamebasenameextnamesplit

この問題は、Apple が古い Macintosh オペレーティング システムを使用していた頃にはさらに深刻でした。Mac OS への移行は:、セパレーターとしての使用をやめたため、助けになりましたが、手動でファイル名を作成していた人々は、間違った区切り文字が生成されたためにコードが壊れていることに気づきましたが、ライブラリを利用すると問題が処理されました。

この特定の問題はバグではなく、Ruby の管理下にあるものでもなく Apple の問題であるため、Ruby の問題ではなく、視覚化の問題であり、ファイル名を Finder がコードを表示するものに似せたい場合は、それに応じて.

于 2012-11-08T23:38:11.287 に答える