2017-09-20 5 views
0

この質問はCheck if NSURL is Local Fileと重複しません。NSStringがローカルファイルであることを確認してください

ローカルファイルパスとHTTP/HTTPS/FTPスキームを持つリモートファイルパスの2種類の文字列パスポイントがあります。

NSString *path = ... ; // like "https://img.server.com/foo.jpeg" or "/Users/myname/Library/Developer/CoreSimulator/Devices/xxxxx/data/Containers/Data/Application/xxxx/Documents/file.txt" 

NSURL url1 = [NSURL URLWithString:path]; 
NSURL url2 = [NSURL fileURLWithPath:path]; 

私はそれらのどれもが、私はNSStringのパスは、ローカルファイルパスまたはリモートファイルのURLであるかどうかを識別するのに役立つことができなかった、schemefileURLisFileReferenceURLプロパティをチェックします。

助けてください!

+0

文字列の値に応じて 'URLWithString:'または 'fileURLWithPath:'を使って 'NSString'から' NSURL'を作成する必要があるかどうかを判断する方法は? – rmaddy

+0

はい、 'URLWithString:'は一般的なリモートファイルURLに使われています。 'fileURLWithPath:'はローカルファイルパスに使われていると思います。ソースパスがローカルファイルパスかどうかを知る必要があります。 – Itachi

答えて

1

をURLの例のすべての種類を試した後、私はNSURLクラスを考えますこれがローカルファイルパスをチェックする最終的な方法ではないかもしれません。今私は次の関数を使用します。

BOOL IsLocalFilePath(NSString *path) 
{ 
    NSString *fullpath = path.stringByExpandingTildeInPath; 
    return [fullpath hasPrefix:@"/"] || [fullpath hasPrefix:@"file:/"]; 
} 

それは/path/to/foofile:///path/to/foo~/path/to/foo../path/to/fooのようなローカルファイルパスをカバーしています。

これまでのところUnix-like pathのためにうまくいきますが、いくつかの例外があります。

0

なぜファイルパスのプレフィックスをチェックするだけではないのですか?

BOOL  bIsFileURL = [path hasPrefix: @"/"]; 

または、相対パスでもかまいませんか?その場合 、あなたはHTTPをチェックすることができます://、https://でまたはftp://接頭辞をリモートパスに:

NSString *schemeRegex = @"(?i)^(https?|ftp)://.*$"; 
BOOL  bIsRemoteURL; 

bIsRemoteURL = [path rangeOfString:schemeRegex 
          options:NSRegularExpressionSearch].location != NSNotFound; 
+0

はい、より一般的な文字列パス関数でローカルファイルパスを検証する必要があります。 urlスキームは[any types](https://en.wikipedia.org/wiki/URL)である可能性があるため、正規表現はここでは役に立ちません。 – Itachi

+0

これを使用します。ファイルパスには:を付けることはできませんが、いずれのURLスキームにもあります。 bIsRemoteURL = [パスrangeOfString:@ ":"オプション:NSLiteralSearch] .location!= NSNotFound; 一方、リモートURLにスキームがない場合は、ファイルまたはリモートURLを区別できません。名前を持つローカルファイルが存在するかどうかを調べることができますが、スキームがなければリモートURLパスを持つファイルも存在する可能性があるため、問題があります。 – clarus

関連する問題