2017-08-10 86 views
1

蘋果表示,用於存放應用程序狀態存儲在「應用程序支持」文件夾中的文件,並以「使用應用程序支持目錄不變NSApplicationSupportDirectory」獲取德爾福MacOS的應用程序支持文件夾

https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW11

Delphi的類對於TPATH方法有各種TPath.GetXXXX(包括TPath.GetLibraryPath的,但我無法找到一個返回的應用程序支持文件夾。

我怎樣才能獲得應用程序支持文件夾中Firemonkey應用程序嗎?

+0

這對你有幫助嗎? http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.IOUtils.TPath.GetDocumentsPath。另外,如果您需要存儲用戶設置,請查看http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.IOUtils.TPath.GetHomePath –

+0

@AlbertoMiola不知道與OP的問題(Documents文件夾)有什麼關係遠不及應用程序支持文件夾。 –

回答

2

硬編碼的方法(你可能已經嘗試過);由於應用程序支持文件夾是庫文件夾下:

uses System.IOUtils; 

function GetApplicationSupportDir : string; 

begin 
    Result := TPath.Combine(TPath.GetLibraryPath,'Application Support'); 
end; 

或者,直接從iOS或OSX檢索它:(有關的Delphi XE8和更高)

uses 
    Macapi.Helpers, 
    {$IFDEF iOS} 
    iOSapi.Foundation, 
    {$ENDIF} 
    {$IFDEF OSX} 
    Macapi.Foundation, 
    {$ENDIF} 

    System.IOUtils; 

function GetApplicationSupportDir : string; 

var 
    Paths : NSArray; 
    Dir : NSString; 

begin 
    // For "Application Support" under the User's Library directory: 
    Paths := TNSArray.Wrap(NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, True)); 

    // For "Application Support" under the System Library directory: 
    //Paths := TNSArray.Wrap(NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSSystemDomainMask, True)); 


    Dir := TNSString.Wrap(Paths.objectAtIndex(0)); 

    Result := NSStrToStr(Dir); 
end; 

對於XE7,這可能工作:

uses 
    Macapi.Helpers, 
    {$IFDEF iOS} 
    iOSapi.Foundation, 
    {$ENDIF} 
    {$IFDEF OSX} 
    Macapi.Foundation, 
    {$ENDIF} 

    System.IOUtils; 

///////////////////////////// Added since XE7: 

const 
    _PU = '_'; 
    libFoundation = '/System/Library/Frameworks/Foundation.framework/Foundation'; 

type 
    NSUInteger = LongWord; 
    NSSearchPathDirectory = NSUInteger; 
    NSSearchPathDomainMask = NSUInteger; 

function NSSearchPathForDirectoriesInDomains(directory: NSSearchPathDirectory; domainMask: NSSearchPathDomainMask; 
    expandTilde: Boolean): Pointer {NSArray}; cdecl; 
    external libFoundation name _PU + 'NSSearchPathForDirectoriesInDomains'; 

///////////////////////////// 

function GetApplicationSupportDir : string; 

var 
    Paths : NSArray; 
    Dir : NSString; 

begin 
    // For "Application Support" under the User's Library directory: 
    Paths := TNSArray.Wrap(NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, True)); 

    // For "Application Support" under the System Library directory: 
    //Paths := TNSArray.Wrap(NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSSystemDomainMask, True)); 

    Dir := TNSString.Wrap(Paths.objectAtIndex(0)); 

    Result := NSStrToStr(Dir); 
end; 
+0

我確實想直接從OSX獲取它,因爲字符串「應用程序支持」在本地化時可能會有所不同。 我試過使用NSSearchPathForDirectoriesInDomains,但我無法在Macapi.Foundation中找到它,或者在任何用於Delphi XE7的OSX源文件中找到它。有不同的名字嗎?或者可能在10.2中添加了? –

+0

@MikeatBookup - 是的,它不在XE7中;它被添加到XE8中。我想出了需要什麼,併爲XE7創建了一個可能的解決方案。更新了答案。 –