2012-03-11 17 views
6

Quiero usar los permisos octales (usados ​​para chmod) para NSFilePosixPermissions. Aquí es lo que hice ahora:NSFileManager & NSFilePosixPermissions

NSFileManager *manager = [NSFileManager defaultManager]; 
NSDictionary *atributes; 

[atributes setValue:[NSString stringWithFormat:@"%d", 0777] 
      forKey:@"NSFilePosixPermissions"]; // chmod permissions 777 
[manager setAttributes:atributes ofItemAtPath:@"/Users/lucky/Desktop/script" error:nil]; 

consigo ningún error, pero cuando puedo comprobar el resultado con "ls -o" el permiso are't -rwxrwxrwx.

¿Qué pasa? Gracias por ayuda.

Respuesta

12

Primero, NSFilePosixPermissions es el nombre de una constante. Su valor también puede ser el mismo, pero eso no está garantizado. El valor de la constante NSFilePosixPermissions podría cambiar entre las versiones del marco, e. gramo. desde @"NSFilePosixPermissions" hasta @"posixPermisions". Esto rompería tu código. La forma correcta es usar la constante como NSFilePosixPermissions, no @"NSFilePosixPermissions".

Además, el NSFileManager class reference dice acerca NSFilePosixPermisions:

The corresponding value is an NSNumber object. Use the shortValue method to retrieve the integer value for the permissions.

La forma correcta de establecer permisos POSIX es:

// chmod permissions 777 

// Swift 
attributes[NSFilePosixPermissions] = 0o777 

// Objective-C 
[attributes setValue:[NSNumber numberWithShort:0777] 
      forKey:NSFilePosixPermissions]; 
+0

¡Gracias! Solo configurar el valor de NSFilePermissions no funciona. Lo hice así: 'NSMutableDictionary * attributes = [NSMutableDictionary dictionaryWithDictionary: [manager attributesOfItemAtPath: @" file ... "error: nil]];' Siguiente paso Configuré los permisos y funcionó ! – qwertz

+2

También puede usar la notación literal para pasar un NSNumber (y NSDictionary): '@ {NSFilePosixPermissions: @ 0777}' – Matthematics

+1

Tenga en cuenta que el cero inicial aquí es crítico. Eso le dice al compilador de C que su constante está en Octal. Octal 0777 tiene 511 en decimal, ¡no el mismo número! –

2

solución en Swift 3

let fm = FileManager.default 

var attributes = [FileAttributeKey : Any]() 
attributes[.posixPermissions] = 0o777 
do { 
    try fm.setAttributes(attributes, ofItemAtPath: path.path) 
}catch let error { 
    print("Permissions error: ", error) 
} 
0

Solución en Swift 4

Intenté usar 0o777 y esto no cambió el archivo a solo lectura. Creo que la forma correcta de hacerlo es la siguiente:

let fileManager = FileManager.default 

let documentsUrl: URL = self.fileManager.urls(for: .documentDirectory, in: .userDomainMask).first as URL! 

let destinationFileUrl = documentsUrl.appendingPathComponent(fileName) 

let readOnlyAttribute: [FileAttributeKey: Any] = [ 
      .posixPermissions: 0777 
     ] 
do {  

    try fileManager.setAttributes(readOnlyAttribute, ofItemAtPath: destinationFileUrl.path) 

    if fileManager.isWritableFile(atPath: destinationFileUrl.path) { 
     print("writeable") 
    } else { 
     print("read only") 
    } 

} catch let error { 

    print("Could not set attributes to file: \(error.localizedDescription)") 
} 
Cuestiones relacionadas