17

I am making a func that edits a text file in the Users/johnDoe Dir.

let filename = "random.txt"
let filePath = "/Users/johnDoe"
let replacementText = "random bits of text"
do {

 try replacementText.write(toFile: filePath, atomically: true, encoding: .utf8)

}catch let error as NSError {
print(error: + error.localizedDescription)
}

But I want to be able to have the path universal. Something like

let fileManager = FileManager.default
    let downloadsURL =  FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first! as NSURL
    let downloadsPath = downloadsURL.path

but for the JohnDoe folder. I haven't been able to find any documentation on how to do this. The closest thing I could find mentioned using NSHomeDirectory(). And I am not sure how to use it in this context.

when I try adding it like...

let fileManager = FileManager.default
    let downloadsURL =  FileManager.default.urls(for: NSHomeDirectory, in: .userDomainMask).first! as NSURL
    let downloadsPath = downloadsURL.path

I get an error:

"Cannot Convert value of type 'String' to expected argument type 'FileManager.SearchPathDirectory'"

I've tried it .NSHomeDirectory, .NSHomeDirectory(), NShomeDirectory, NShomeDirectory()

Leo Dabus
  • 216,610
  • 56
  • 458
  • 536
JonnyTombstone
  • 189
  • 1
  • 1
  • 6

4 Answers4

37

You can use FileManager property homeDirectoryForCurrentUser

let homeDirURL = FileManager.default.homeDirectoryForCurrentUser

If you need it to work with earlier OS versions than 10.12 you can use

let homeDirURL = URL(fileURLWithPath: NSHomeDirectory())

print(homeDirURL.path)
Leo Dabus
  • 216,610
  • 56
  • 458
  • 536
  • You sir... I could kiss you write now =). very simple and works like a charm. I guess I was trying to over think it. – JonnyTombstone Dec 29 '16 at 18:20
  • 6
    This will return app's home folder instead of user's if sandbox – Oleksii Nezhyborets Jul 24 '19 at 15:34
  • This Answer is just for macOS, do we have home dir or something like that for iOS as well? – ios coder Jan 16 '22 at 14:26
  • @ioscoder There is no home folder for iOS. What you have is the documents directory – Leo Dabus Jan 16 '22 at 14:47
  • @ioscoder for more info about which folder to use you should take some time and read [File System Basics](https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html). If you would like to get a specific folder in your app check this post [Getting list of files in documents folder](https://stackoverflow.com/a/27722526/2303865) – Leo Dabus Jan 16 '22 at 14:48
4

There should be an easier way but -- at worst -- this should work:

let filePath = NSString(string: "~").expandingTildeInPath
Phillip Mills
  • 30,584
  • 4
  • 41
  • 56
0

Swift 5 (and maybe lower)

let directoryString: String = NSHomeDirectory()
let directoryURL: URL = FileManager.default.homeDirectoryForCurrentUser
Justin Vallely
  • 5,525
  • 3
  • 27
  • 40
-1

Maybe

FileManager.homeDirectoryForCurrentUser: URL

It's listed as "beta" for 10.12, though.

Mike
  • 1