الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Ffiles.c

بدأه ToBeOrNotToBe في 10 نوفمبر 2009 · 10 رد · 812 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه

i have some problem with this code because i need to rename files show how to execute myprog.c in the terminal:

root@$: ./ myprog.c a.txt b.txt

but b.txt already exists, myprog.c will move the file to b.txt.1. Note that if b.txt.1 exists, you

must rename the file to b.txt.2, and so on, until you can successfully rename the file to a name

that does not already exist.

#include<string.h>
#include<stdio.h>

int main(int argc,char *argv[])
{
int i=1;
int result;

  if ( argc = 2 ){ 
    while (  argv[2] != NULL  ){
            i++;
    result= rename( argv[1] ,strcat(argv[2],".i")); // i can not count number of file , just print i after file name like b.txt.i
        break;
        }
    }    


  if ( result == 0 )
   puts ( "File successfully renamed" );
 else {
   perror( "Error renaming file" );
  return 0;
}

else

printf("ERROR IN NUMBER OF ARGUMENTS \n");
}

شكراً

تم تعديل هذه المشاركة بواسطة ToBeOrNotToBe في 10 نوفمبر 2009 في 07:38

#2

شئ كهذا قد يفيد

(مع التحفظ إن وجدت أخطاء أو buffer overflow فعليك التعديل في الكود )

#include<stdio.h>

int main(int argc,char *argv[])
{
int i=0;
int result;
FILE * pFile;
char filename[256];

if ( argc = 2 ){ 
 sprintf(filename,"%s",argv[2]);
 while ( filename != NULL ){
  pFile = fopen (filename,"r");
  if (pFile!=NULL){
   i++;
   printf("i= %d\n",i);
   sprintf(filename,"%s.%i",argv[2],i);
  }
  else
   break;
 }
 result= rename( argv[1] ,filename); 
 if ( result == 0 )
  puts ( "File successfully renamed" );
 else 
  perror( "Error renaming file" );
}
else
 printf("ERROR IN NUMBER OF ARGUMENTS \n");
return 0;
}
#3

السلام عليكــم ورحمـة الله وبركاتــه ،،

قم بتعديل رد ياسين كما يلي ثم قم بترجمة التطبيق.

if ( argc == 3 ){

لتجربة التطبيق

اقتباس

C:\Documents and Settings\....\Visual Studio 2005\test\debug>test b.txt c.txt

File successfully renamed

#4

ياسين ,, بن العيد شكراً جزيلاً لكم

ماهي فائدة هذه الدالة sprintf وهل تشرح لي كيف يعمل هذا الكود ؟؟

لماذا نفتح الملف بصلاحية القراءة طالما اننا لانريد ان نقرأ او نكتب فيه , بل اريد ان اغير اسمه فقط لماذا افتحه ؟؟

sprintf(filename,"%s",argv[2]);
while ( filename != NULL ){
  pFile = fopen (filename,"r");
  if (pFile!=NULL){
   i++;
   printf("i= %d\n",i);
   sprintf(filename,"%s.%i",argv[2],i);
  }

ولكن اذا اردت ان اجعل المستخدم يدخل اسماء الملفات ك ( Input ) من الكونسول كيف اعمل ذلك ؟؟

بحيث يدخل اسم الملف القديم الموجود في الهاردسك ويدخل الاسم الجديد للملف الذي يريد انه يسميه به .

تم تعديل هذه المشاركة بواسطة ToBeOrNotToBe في 11 نوفمبر 2009 في 04:57

#5

السلام عليكــم ورحمـة الله وبركاتــه ،،

اقتباس
لماذا نفتح الملف بصلاحية القراءة طالما اننا لانريد ان نقرأ او نكتب فيه , بل اريد ان اغير اسمه فقط لماذا افتحه ؟؟

معك حق. خاصة أنه لم يستشرك:D

فتحت الملف ليه يا ياسر !! :angry:

 

int main(int argc,char *argv[])
{
int i=1;
int result;

if ( argc == 3 )
{ 
  while ( argv[2] != NULL )
  {
  i++;
  result= rename( argv[2] ,strcat(argv[3],".i")); // i can not count number of file , just print i after file name like b.txt.i
  break;
  };



if ( result == 0 )
puts ( "File successfully renamed" );
else {
  perror( "Error renaming file" );
  return 0;
    }
}
else

printf("ERROR IN NUMBER OF ARGUMENTS \n");
}
#6

عند تنفيذ هذا الكود يظهر لي هذا :-

954712152.gif

ماهي المشكلة . هل لابد ان تكون الملفات في مجلد Debug ام لا ؟

#7

عذراً , لم أنتبه للخطأ في جملة الشرط فقد كان اهتمامي بالجزء داخل الـ loop ..

هذا الكود ربما يعمل بصورة صحيحة الآن

#include<stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int i=0;
int result;
extern int errno; //use _get_errno instead
char filename[256];

if ( argc == 3 )
{ 
 sprintf(filename,"%s",argv[2]);
 while ( filename != NULL )
 {
  result= rename( argv[1] ,filename); 
  if ( result == 0 )
   break;
  if(errno ==2) //ENOENT 
  {
   printf( "File %s is not exist!",argv[1] );
   return -1;
  }
  i++;
  sprintf(filename,"%s.%i",argv[2],i);
  printf("i= %d %s\n",i, filename);
 };
 if ( result == 0 )
  puts ( "File successfully renamed" );
 else 
  perror( "Error renaming file" );  

}
else
 printf("ERROR IN NUMBER OF ARGUMENTS \n");
return 0;
}

في ردي السابق الغرض من إستخدام fopen هو للتأكد من أن الإسم الجديد هو لملف موجود مسبقاً , لكن لا ضرورة لذلك حيث أن rename تقوم بهذا الشئ .

في الكود الأخير هناك عملية تأكد من كون الملف المراد تغيير إسمه موجود فعلياً ... السبب ... (جرب وأخبرني ).

#8
YaSeenTA كتب:
عذراً , لم أنتبه للخطأ في جملة الشرط فقد كان اهتمامي بالجزء داخل الـ loop ..

هذا الكود ربما يعمل بصورة صحيحة الآن

#include<stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int i=0;
int result;
extern int errno; //use _get_errno instead
char filename[256];

if ( argc == 3 )
{ 
 sprintf(filename,"%s",argv[2]);
 while ( filename != NULL )
 {
  result= rename( argv[1] ,filename); 
  if ( result == 0 )
   break;
  if(errno ==2) //ENOENT 
  {
   printf( "File %s is not exist!",argv[1] );
   return -1;
  }
  i++;
  sprintf(filename,"%s.%i",argv[2],i);
  printf("i= %d %s\n",i, filename);
 };
 if ( result == 0 )
  puts ( "File successfully renamed" );
 else 
  perror( "Error renaming file" );  

}
else
 printf("ERROR IN NUMBER OF ARGUMENTS \n");
return 0;
}

في ردي السابق الغرض من إستخدام fopen هو للتأكد من أن الإسم الجديد هو لملف موجود مسبقاً , لكن لا ضرورة لذلك حيث أن rename تقوم بهذا الشئ .

في الكود الأخير هناك عملية تأكد من كون الملف المراد تغيير إسمه موجود فعلياً ... السبب ... (جرب وأخبرني ).

عزيزي ياسين الكود لايكمل التنفيذ بسبب الشرط :

if(errno ==2) //ENOENT

وعندما امسح هذا الشرط يعمل ..

الآن اذا اردت ان اجعل المستخدم يدخل اسماء الملفات ك ( Input ) من الكونسول كيف اعمل ذلك ؟؟

بحيث يدخل اسم الملف القديم الموجود في الهاردسك ويدخل الاسم الجديد للملف الذي يريد انه يسميه به .

هل تعطيني الكود الخاص بهذا لانني لم استطع حله ؟؟

مثلاً :

اطبع رسالة تقول للمستخدم ادخل اسم الملف a.txt

بعد ذلك يدخل المستخدم اسم الملف

ثم اطبع رسالة تقول للمستخدم ادخل الاسم الذي تريد ان تسمي به الملف a.txt

بعد ذلك يدخل المستخدم اسم الملف الجديد وليكن b.txt

وعندما يتنفذ الكود يتغير اسم الملف a.txt الى b.txt بحيث لانتعامل مع arg2 argv1

وكيف اغير في الكود السابق بحيث يكون هنالك Menu يتعامل معها اليوزر على شكل رسائل وجمل ادخال ..

#9

شئ كهذا قد يفيدك

عليك التغيير بما يتناسب مع ما تريده

int main(int argc,char *argv[])
{
int i=0;
int result;
extern int errno; //use _get_errno instead
char filename[256];
char fileTobeRenamed[256];
char fileNewName[256];

printf("Pls input the file (with path) you want to rename\n");
scanf("%s",fileTobeRenamed);
printf("Pls input the new name\n");
scanf("%s",fileNewName);
//if ( argc == 3 )
//{ 
 sprintf(filename,"%s",fileNewName);//argv[2]);
 while ( filename != NULL )
 {
  result= rename( /*argv[1]*/ fileTobeRenamed,filename); 
  if ( result == 0 )
   break;
  if(errno ==2) //ENOENT 
  {
   printf( "File %s is not exist!",fileTobeRenamed);//argv[1] );
   return -1;
  }
  i++;
  sprintf(filename,"%s.%i",/*argv[2]*/fileNewName,i);
  printf("i= %d %s\n",i, filename);
 };
 if ( result == 0 )
  puts ( "File successfully renamed" );
 else 
  perror( "Error renaming file" );  

//}
/*else
 printf("ERROR IN NUMBER OF ARGUMENTS \n");*/
return 0;
}

اقتباس
عزيزي ياسين الكود لايكمل التنفيذ بسبب الشرط :

if(errno ==2) //ENOENT

بل يعمل بشكل صحيح . انت قمت بتجربة البرنامج في وضع Debug ؟ إن كان كذلك فعليك كتابة اسم الملف مع المسار كاملاً ..

الجملة الشرطية السابقة للتأكد من أن الملف المراد تسميته موجود مسبقاً وإن حذفت هذه الجملة وكان الملف غير موجود فسيدخل البرنامج في loop غير منتهي...

جرب الكود في هذا الرد وناقش جميع الحالات ومن ضمنها عدم وجود الملف..

#10

عندما اقوم بعمل Compile يعطيني هذا الخطأ علماً انني استخدم كمبايلر اللينكس gcc

/usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in /tmp/ccsPd47n.o

/lib/libc.so.6: could not read symbols: Bad value

collect2: ld returned 1 exit status

تم تعديل هذه المشاركة بواسطة ToBeOrNotToBe في 12 نوفمبر 2009 في 06:42

#11

إحذف هذا السطر من أخر كود

extern int errno; //use _get_errno instead

Tested on Windows Vista using VC6.0 & MinGW 5.1.6

على الأغلب عدم وجود مشكلة مع GCC في نظام Linux ...

إن قابلت مشكلة ضع رسالة الخطأ