سؤال

أنا أستخدم شيئًا كهذا:

char *file;
file = (char *)malloc(BUFSIZE * sizeof(char));
printf("Enter the filename:");
scanf("%s", file);
if(remove(file)) {
   printf("Error while removing");
}

لقد قمت بإنشاء ملفين:

touch filetobedeleted1.txt
chmod 777 filetobedeleted1.txt

touch filetobedeleted2.txt
chmod 444 filetobedeleted2.txt

الآن ، يزيل برنامجي كلا الملفين ولكن ليس من المفترض أن يحدث هذا بشكل صحيح؟ أي شخص يعرف ما هو الخطأ في الكود؟

تحرير: أضاف الرمز لوضع الاسم في ملف ...

حسنًا ... يبدو أن كل شيء يتوقف على الأذونات المحددة على الدليل ولكن بعد ذلك هل هناك طريقة لاستخدام أذونات الملفات كتحقق؟

هل كانت مفيدة؟

المحلول

ضمن دلالات نظام ملفات POSIX ، فإن التحقق من الإذن المستخدم لحذف ملف هو ما إذا كان يمكنك الكتابة إلى الدليل الذي يوجد فيه الملف ؛ ليس سواء كان لديك إذن الكتابة على الملف نفسه.

(إذا كان الدليل يحتوي على مجموعة بت لزجة ، فيجب أن تكون أيضًا صاحب الملف - /tmp يستخدم هذا).

نصائح أخرى

إن إزالة الملف لا يحتاج إلا إلى الوصول إلى الكتابة على الدليل.

بالمعنى الدقيق للكلمة ، فإن ما تزيله هو إشارة إلى الملف ، وربط الصلبة. لن يتم حذف الملف نفسه حتى تختفي جميع الروابط إلى الملف.

جربه مع أمر RM!

remove() المكالمات unlink(), ووفقا ل man 2 unlink, ، لا يحتاج إلا إلى أذونات الكتابة إلى الأبوين الدليل.

يمكنك استعمال ال getumask() الوظيفة ومنحه شيكًا قبل الاتصال remove().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top