2011-09-26 45 views
1

我正在創建一個跨平臺的軟件,我想知道是否有任何(簡單)方法在C#中讀取/寫入Unix(Mac OSX/Linux)擴展文件屬性。 我剛剛閱讀了xattr命名空間,但是我還沒有找到任何有關此功能的C#實現或綁定的信息。C#xattr文件屬性

P.S.我到目前爲止發現的唯一的東西是python-xattr庫,但我不想使用它,因爲:

  • 我不想強制用戶安裝Python(已經有Mono/.NET依賴處理)
  • 通過使用Python我會有一個性能下降(C#編譯,而Python解釋)
  • 我不想依賴/依賴外部工具(如果可能的話),因爲它是不安全
+0

很多時候,依賴外部庫比編寫自己的庫更安全,因爲它最有可能具有更少的錯誤。還是你的意思是「安全」的東西? – svick

+0

@svick我認爲他的安全意味着什麼。 C#是一種託管語言,python不是。 – thekip

+0

@thekip是對的,我只想擁有一個完全託管的代碼和可能的同質開發環境。我已經使用C#作爲粘連:D用於HTTP5 + jQuery + JSON應用(運行在xulrunner中),本地C#代碼,SQLite/MySQL包裝 - 實體提供者等。 通過添加一些其他(非託管)語言和工具,不會讓我的應用更穩定。 – Salaros

回答

0

最終的解決方案可能是以下,告訴我你怎麼看?

FileAttrsManager是一個抽象類,用於創建2派生類:

  • FileAttrsManagerDos:管理使用DSOFile.dll *
  • FileAttrsManagerUnix高級屬性:使用IronPython的管理高級屬性*和python-xattr **

[*] http:\\ www.micros oft.com/download/en/details.aspx?displaylang=en & id = 8422
[**] http:\\ ironpython.codeplex.com
[** *] http:\\ pypi.python.org /的PyPI/XATT

擴展屬性的操作(如SetPropery(string key, object value)GetProperty(string key)等)將在一個靜態類(FileAttrsProvider),該初始化FileAttrsManager目的是兩個派生類型中的一種來管理,即:

public static class FileAttrProvider 
{ 

private static FileAttrReader _reader = null; 

public static void Initialize() 
{ 
    switch (Environment.OSVersion.Platform) 
    { 
     case PlatformID.MacOSX: 
      goto case PlatformID.Unix; 
     case PlatformID.Unix: 
      _reader = new FileAttrReaderUnix(); 
      break; 
     case PlatformID.Win32NT: 
      _reader = new FileAttrReaderDos(); 
      break; 
    } 
} 
} 

雖然派生類型取決於環境,原始類型用於確保調用_reader對象上的所有方法的自動調度)。

0

我認爲Mono.Unix.Native.Syscall.setxattr是一個更好的解決方案,它在Mono.Posix模塊中。