如何在Swift命令行应用程序中从文件系统读取文件?

时间:2019-01-18 09:54:47

标签: swift command-line-interface

我才刚刚开始学习Swift,并且要自学,我正在制作一个简单的命令行应用程序。最终它将连接到在线数据源,但最初我想从文件中加载数据。我已经看过各种有关在Swift中读取文件内容的指南,但似乎没有一个对我有用。到目前为止,这是我的应用程序:

char tmp1[seq_cnt][5+1];     
char tmp2[seq_cnt][5+1];     

运行它会输出:

import Foundation

// Set the file path
let path = "/Users⁩/username/workspace⁩/⁨Swift⁩/sis⁩/sis/data.json⁩"

do {
    // Get the contents
    let contents = try String(contentsOfFile: path, encoding: .utf8)
    print(contents)
}
catch let error as NSError {
    print("Ooops! Something went wrong: \(error)")
}

但是在终端上:

Ooops! Something went wrong: Error Domain=NSCocoaErrorDomain Code=260 "The file “data.json⁩” couldn’t be opened because there is no such file." UserInfo={NSFilePath=/Users⁩/username/workspace⁩/⁨Swift⁩/sis⁩/sis/data.json⁩, NSUnderlyingError=0x100e19a50 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}

(是的,我以某种方式放宽了权限,以防万一是问题所在)

我注意到的唯一异常现象(除了不正确的断言该文件不存在之外)是,当我将XCode输出的路径复制并粘贴到iTerm2中时,它将在每个路径组件之间放置空格:

path with spaces

(粘贴为图像,然后将其复制并粘贴回此形式似乎隐藏了空格-无论如何这都可能无关紧要)

任何帮助弄清楚这一点的人将不胜感激!

2 个答案:

答案 0 :(得分:1)

如果您的命令行应用程序被沙盒化,您将无法读取。您可以做的是将此文件添加到您的项目中,并通过在身份检查器中查看文件的完整路径来设置文件路径。 enter image description here

let path = "/Users/snx/EmailReplacer/EmailReplacer/shared_domains_staging.json"
do {
    let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
    let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
    if let jsonResult = jsonResult as? Dictionary<String, AnyObject> {
        print(jsonResult)
    }
} catch {
    print(error)
}

答案 1 :(得分:0)

我复制了您的代码,将sample json文件下载到了我的桌面上,并将其重命名为example_ 1.json(我在文件名中包含一个空格)。

import Foundation

// Set the file path
let path = "/Users⁩/username/Desktop/example_ 1.json⁩"

do {
    // Get the contents
    let contents = try String(contentsOfFile: path, encoding: .utf8)
    print(contents)
}
catch let error as NSError {
    print("Ooops! Something went wrong: \(error)")
}

它成功打印了文件。当我将内容定义为NSString时,它也起作用。

let contents = try NSString(contentsOfFile: path, 
                            encoding: String.Encoding.ascii.rawValue)

我正在使用 Swift 4.2.1