I am attempting to create what should be a rather simple function, isInTrash, to return whether a file path passed to it points to a location in any trash. This thread https://developer.apple.com/forums/thread/110864 got me partway there, but the results I am getting don't match with what I expect.
Function:
func isInTrash(file: String) -> Bool {
guard let fileURL = URL(string: file) else {
return false
}
var relationship: FileManager.URLRelationship = .same
let defaultManager: FileManager = FileManager.default
do {
try defaultManager.getRelationship(&relationship,
of: FileManager.SearchPathDirectory.trashDirectory,
in: FileManager.SearchPathDomainMask(rawValue: 0),
toItemAt: fileURL)
} catch {
NSLog("Unable to get relationship of path to trash.:\n")
}
return relationship == .contains
}
Unit Test:
func testInTrashPaths() {
XCTAssertTrue(handler.isInTrash(file: "/Users/username/Trash/foo")) //fails
XCTAssertTrue(handler.isInTrash(file: "/Users/username/.Trash/foo")) //fails
XCTAssertTrue(handler.isInTrash(file: "/Users/username/.Trash/bar")) //fails
XCTAssertTrue(handler.isInTrash(file: "/Users/username/.Trash/blah")) //fails
XCTAssertTrue(handler.isInTrash(file: "/Users/username/.Trash/test/bang")) //fails
XCTAssertFalse(handler.isInTrash(file: "/Users/username/Desktop/test/bang")) //succeeds
}
The tests that should return true all fail. The negative test succeeds, but that's not really a surprise. If I switch to testing for .same instead of .contains, then the first Assert succeeds ("/Users/username/Trash/foo").
Two questions about that behavior.
it appears that while the actual path, if you open the trash in a terminal and use pwd, is /.Trash, the api treats it as /Trash. Why?
/Trash/foo returns .same instead of .contains. Why is it saying that a file inside the trash has a relationship of .same to the Trash? It's very clearly a contains relationship. What's going on?
If I sanitize the inputs by substituting "/" for "/." using replacingOccurrences(of:with:), then everything except the negative test fails. When I step through in the debugger, I find that now a path to a file on the desktop is returning .same for the Trash! WHAT!?!?!? WHY!?!?
I would dearly love to know what I'm doing wrong here.
Selecting any option will automatically load the page