2013-08-24 71 views
1

我已經編寫了用於Windows上的應用程序的虛擬系統(VFS)。現在,我將我的應用程序移至iOS,並與dirrent有問題。iOS - dirent.h - 當前目錄名稱

Windows端口已添加有關當前文件夾的信息,其中的文件位於。

DIR * dir = opendir(dirName); 
char * dirFullPath = dir->patt; //this is missing at iOS 

我該如何獲得該信息? DirName變量是無用的,因爲它唯一的相對路徑。

第二,在Windows上,我指定要作爲我的VFS的根映射的文件夾。我怎麼能爲iOS做同樣的事情?比方說,將VFS映射到目錄DATA。

+0

請勿爲路徑使用字符串。這是一個壞主意。你應該使用NSURL。隨意編寫你自己的C++包裝器,但是當爲iOS編譯時應該使用NSURL。讓您的wapper在Windows或任何其他平臺上使用推薦的API。 –

+0

我沒有看到char *沒有錯。 NSURL不是ANSI C++兼容的,這個解決方案將會混亂。現在我有相同的代碼,我可以隨處移植,只需稍作更改。 –

回答

1

NSSearchPathForDirectoriesInDomains()是應該避免,除非你需要它的一些不尋常的原因,低層次的API。相反,你應該使用NSURL。這是蘋果官方推薦:

的NSSearchPathForDirectoriesInDomains函數的行爲像 URLsForDirectory:inDomains:方法,但返回目錄的 位置作爲一個基於字符串的路徑。您應該使用 URLsForDirectory:inDomains:方法。

它這樣使用:

NSURL *documentsURL = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].lastObject; 

的NSURL對象不正是你想要的東西:它是一個包含基礎URL的對象,然後在一個相對URL。

如果你正在編寫一個跨平臺的應用程序,你需要爲所有不是跨平臺的東西編寫一個封裝器,並且文件系統操作是你需要抽象的東西之一。用NSURL和NSFileManager編寫一個C++包裝器,並讓你的包裝器在其他平臺上使用其他的東西。

NSURL通常比使用字符串更快,可靠性更低且使用更少的RAM。通常它使用低級文件系統/扇區引用。

+0

就需要編寫一個不是跨平臺的包裝 - 這不完全是真的。 dirent.h是用於文件系統操作的C UNIX庫,工作正常。唯一的問題是,找到開始目錄。我可以毫無問題地打印出完整的文件系統(我也有存檔支持)。 NSURL可能更安全,但字符串是多平臺的。 –

+0

@MartinPerry yes但UNIX文件系統庫在OS X和iOS上基本不推薦使用。歷史是Mac OS 9/classic,FSRef和NeXT使用標準的UNIX庫,並且都有不同的優缺點。你現在可以使用其中一種(許多人仍然可以),但是NSURL已經被創建來合併這兩種API的優勢,這就是你應該使用的。它速度更快,功能更多,並且缺少bug /陷阱。 dirent.h很少支持諸如全盤加密和文件系統授權等一些事情。 –

+0

是的,但UNIX庫也應該可以正常工作。棄用!=不工作:)正如我所說,重寫整個VFS以使用NSURL將會非常複雜,並且在我看來也沒有意義,只要UNIX庫正在工作。 –

0
+0

我沒有使用Objective-C,但是C++ ... NSFileManager僅僅是Objective-C,所以沒用.. –

+5

聽起來像你是故意選擇最痛苦的開發路線。祝你好運(我的意思是 - 不是諷刺 - 這是一條絕妙的外星人路線,但你一定會學到很多東西)。你可能最適合使用圍繞你的FS操作的C++包裝,然後由iOS上的NSFileManager提供支持。 – bbum

+0

'聽起來像你是故意選擇最痛苦的開發路線' - 我正在爲iOS,Android,Windows,Linux做多平臺應用程序......所以大部分代碼必須使用ANSI C++。我需要用本地代碼(Objective-C,Java,C#..)寫得越少,更好的 –