2016-12-22 4 views
1

特定のディレクトリにある一連のファイルのアクセス許可を変更しようとしています。私はそうするためにchmodを使用しています。関数はエラーを返しませんが、古いアクセス許可と新しいアクセス許可を出力すると、何も変更されていないように見えます。C - chmod()はアクセス権を変更していません

void main(int argc, char *argv[]){ 
    struct stat archivo;  
    char *directorio = "/home/edu/Escritorio/P7/practica7/prueba"; 
    char *rutaRel = malloc(strlen(directorio) + 1 + NAME_MAX); 
    mode_t permisos; 

    modo = strtol(argv[2], NULL, 0); //I am trying with 0664 

    strcpy(rutaRel, directorio); 
    rutaRel[strlen(directorio)] = '/'; 
    while (ep = readdir (dp)){ 
     strcpy(rutaRel + strlen(directorio) + 1, ep->d_name); 
     stat(rutaRel, &archivo); 
     if(S_ISREG(archivo.st_mode)){ 
      permisos=archivo.st_mode; 
      if((chmod(rutaRel,modo))==-1){ 
       perror("Error: \n"); 
      } 
      printf(" %s: %u -> %u\n",ep->d_name,permisos,archivo.st_mode); 
     } 
    } 

    closedir(dp); 
} 

これまでエラーを特定できませんでした。何か案は?

OUTPUT:

A4:33204 - > 33204

A2:33204 - > 33204

A3:33204 - > 33204

A5:33204 - > 33204

a1:33204 - > 33204

+0

パーミッションは '%o'を使って10進数で出力するために'%u'ではなく8進数で出力すると分かりやすくなります。あなたの 'archivo'変数は、' stat() 'が呼び出されたときにパーミッションを取得します。 'chmod()'によって行われた変更は追跡されません。更新された値を取得するには 'stat()'をもう一度呼び出す必要があります。 –

答えて

6

問題は、ファイルの新しいフラグを取得しないで、を取り込んだのと同じ古いフラグを出力します。を呼び出す前にを呼び出してください。

+0

私はそれを得ていません。私は "permisos"で古いモードを保存しています。パーミッションを変更して、ファイル名、古いモードと新しいモードを印刷していますか? –

+4

@EduardoRamos 'archivo'はファイルの状態を追跡していません - 権限の変更後に' stat(rutaRel、&archivo); 'を再度呼び出さなければなりません。 –

+0

ああ、そうだ。やあ、ありがとう! –

関連する問題