2016-05-21 5 views
0

私は&Pathを持っており、最初のコロンで最後のコンポーネントファイル名を2つに分割する必要があります。特定の文字に&Pathの最終コンポーネントを分割するにはどうすればよいですか?

最終的なコンポーネントは&OsStrpath.file_name())ですが、実際には何かをしています。 (!保証されません):documentationは私にいくつかのオプションが与え

  • to_str()またはto_string_lossy()、失敗したり、それがUTF-8ではない場合は、破損した文字列を返すのいずれか
  • to_bytes()またはto_cstring()を、彼らは」 Rust 1.6以降で廃止予定とマークされています。
  • 右下にはとas_bytes()メソッドがあります。 OsStrExtstd::os::unix::ffi::OsStrExtであり、これは「OsStrに対するUnix固有の拡張」と記載されている。しかし、std::os::unixは明らかに "Unixプラットフォーム用のstdへの実験的な拡張"です。

もっと標準的なものはありませんでしたか?

このアプリケーションではUnixに限ってうれしいので、OsStrExt::as_bytesは今のところ最良の選択肢のようです。それは実際にはまだ実験的なものなのですか?

+0

内容( 'file_name'など)で何をしたいですか? – malbarbo

+0

私は[Maildirs](https://cr.yp.to/proto/maildir.html)でメッセージを使って作業しています。ファイル名は不特定の一意の部分の後に '': ''といくつかのフラグ文字が続く。ユニークな部分に触れることなく、フラグを調べたり変更したりしたい。 –

+0

*これは本当にまだ実験的なものです* * 'unstable'でないなら、あなたはRust 1.xの全てに存在することができるはずです。 – Shepmaster

答えて

2

ファイルシステムのパスを扱う標準的な方法はありません。すべてのプラットフォームがパスの表現と妥当性に関して同じルールを持っているわけではないからです。

UNIXベースのシステム(Linux、Mac OS Xなど)では、パスはnullバイトを含むことができない一連のバイト(u8)です。 std::os::unixモジュールは、これらのプラットフォームで使用できます。モジュールの説明には「実験的」と書かれていますが、そのほとんどは安定しているので、安定した機能は将来のRust 1.xリリースで利用できることが保証されています。

Windows NTでは、パスは16ビットワード(通常はUTF-16コード単位と解釈されます)のシーケンスです。これには、対になっていないサロゲートが含まれる場合があります。内部的には、RustはこれらのパスをWTF-8に変換します(これはUTF-8で、対になっていないサロゲートのエンコードが許可されています.U + D800 – U + DFFF)。 std::os::windowsモジュールはこのプラットフォームで使用できます。それはRustのドキュメンテーションWebサイトには表示されていませんが、stdのドキュメントをローカルに構築する場合は、そこにあるはずです。 The source for this module is here.OsStrを潜在的に不正な形式のUTF-16にエンコードしたり、潜在的に不正な形式のUTF-16パスをOsStringにデコードしたり、WTF-8表現にアクセスすることはできません。differentOsStrExt and OsStringExt traitsを提供します。

+0

ありがとう、それは完全に私の疑問に答える! –

+0

ウィンドウには、多くの機能のASCII版とUnicode版があります。おそらくASCIIエンコードされたバージョンを経由して、内部のWTF-8への変換は、Rustの中でアプローチを見つけるのではなく、システムライブラリに残すことができます。確かに、どちらの選択肢が良いです。 1つの組み込みプロジェクトでは、* nixとwindowsの両方で動作するポータブルファシリティを作成しました(デスクトップ、CE、...).NETライブラリ内の各オブジェクトに似たクラスのセットを記述することによって、私たちはそれに満足していました。 – BitTickler

+0

"ANSI"バージョンでは "ANSI"コードページ以外の文字を使用できないため、アプリケーションでアクセスできないファイルが存在する可能性があるため、RustはUnicodeバージョンを使用します。パスの大部分が法的なUTF-16であるため、RustがUTF-16(WTF-16?)を潜在的にWTF-16に変換する可能性があるため、合法的なUTF-8に変換できます。 Rustの残りの文字列のようにUTF-8としてアクセスできます。 –

関連する問題