[mew-dist 29271] Re: System.EasyFile

Shuichi KITAGUCHI ki at example.com
2010年 8月 13日 (金) 16:05:19 JST


北口です。

このメール見落してました。すみませんm(__)m

> Windows 環境も作ったので、ライブラリー単体のテストはしています。
> 
> 1) cmew/smew が Windows でうまく行くか確かめて下さい。

okです。Mewからも使えました。

あと、この作業をしてて気付いた点を書いておきます。

・"smew 0" という感じで変なものを指定して起動させると、
    smew: getFullPathName: invalid argument (...化けた文字...)
  という風に表示されて、英語モードにすると、
    smew: getFullPathName: invalid argument (The operation completed successfully.)
  となります。ちゃんと指定すれば動くので害はないのですが、ちょっと
  エラーメッセージが意味不明すぎるかな、と(最初悩んだ)。
  ただ、getFullPathNameは、Haskwell本体っぽいですね。

・id.dbがない状態でcmewを起動すると、
  cmew: <どこか>\id.db: copyFile: does not exist (No such file or directory)
  と言われる(Ruby版では、なければ作りにいく)。cmewに-fを付ければok。
  たぶんIndex.hsのwithNewDBのあたりだと思います。

> 2) System.EasyFile の仕様について、何かコメントがあれば
>    お願いします。今はリンクがありませんが、そのうち上記
>    URL の System.EasyFile がクリックできるようになります。
>    そこに関数のドキュメントが現れます。
>    仕様が怪しいところには xxx を付けています。

沢山あって全部詳細には見れていないのですが、気付いた点をば。
# Haskwellの文法をわかってないので、とんちんかんなこと書いてたらすいません。

・isSymlink :: FilePath -> IO Bool
  getLinkCount :: FilePath -> IO (Maybe Int)
  hasSubDirectories :: FilePath -> IO (Maybe Bool)
  →WindowsではNothingみたいなので、その旨の注釈を入れておいては?

・Directory.hs内のfixPathでの以下の行
  | c == '\\' = '/' : fixPath cs
  →'/'はpathSeparatorではない?

・splitExtension/splitDrive等
  →MS-DOSからですが、_splitpath()という関数があり、これを使うとdrive、
    dir、fname、extの4つの要素に分解してくれます。例えばこんな感じです。
      [c:/dir/file.ext]
      =>drive=[c:], dir=[/dir/], fname[file], ext=[.ext]
    これに合わせてしまっても良いのでは、と思いました。そうすると、
    「"\\\\shared\\test"のドライブ名は?」「Posixでのドライブ名とは?」、
    という問題もなくなりますし。ただ、以降のファイル名/ドライブ名/ディレク
    トリ名を扱う関数が全面的に影響を受けそうです。
      [\\shared\test]
      =>drive=[], dir=[\\shared\], fname[test], ext=[]
      [/d]
      =>drive=[], dir=[/], fname[d], ext=[]
    参考 http://msdn.microsoft.com/en-us/library/e737s6tf(VS.80).aspx

・joinDrive
  Windows: joinDrive "\\\\share" "foo" == "\\\\share/foo" -- xxx
  Windows: joinDrive "/:" "foo" == "/:/foo" -- xxx
  →これも上のようにすれば、そもそも"\\share\や"/:"をドライブ名として
    扱うことはないのでは?、と思います。

・takeDirectory
  Windows:  takeDirectory "foo\\bar\\\\" == "foo\\bar" -- xxx
  →これで良いと思います。
    内部的には "foo\bar\\" → "foo\bar\" → "foo\bar" という感じですね。
  Windows:  takeDirectory "C:/" == "C:/"
  →こっちは逆に、上の考えでいくなら"/"なのかなぁ、と。

・normalize
  Windows: normalise "\\\\server\\test" == "\\\\server\\test" -- xxx
  →これは"//server/test"にしちゃって良いと思いますが、懸念点は何でしょうか?

>    特にファイル名が \\ で始まるときに、どうすればいいのか
>    さっぱり分かっていません。

細い規則はこのへんですね。

  http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx

"\\?\D:\<very long path>"とか、"\\.\COM56"とか、得体の知れないのが
沢山ありますが、とりあえず気にしないのが正解なのではと思います。
# Haskwellでそんなのを扱うソフトを書くかどうか次第ですが。


--
Shuichi KITAGUCHI // kit at example.com / ki at example.com


Mew-dist メーリングリストの案内