2017-08-10 62 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创建了一个可能的解决方案。更新了答案。 –