לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 11-12-2011, 12:45
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
עזרה [עזרה] בעיה עם תוכנית בשפת C - העתקת קבצים

היי חברה'.
יש לי בעיה שמציקה לי כבר שבוע. אני מנסה לכתוב תוכנית פשוטה שתעתיק קבצים מתיקיה א' לתיקיה ב', מתוך רשימה בקובץ טקסט.

מה הצלחתי לעשות?
להעתיק את הקבצים תו אחרי תו. זה עובד יפה, אבל מאוד מאוד איטי. יש כנראה יותר מדי קריאות לדיסק:
קוד PHP:
 #include <sys/stat.h>
#include <sys/types.h>
#include <cstdlib>
#include <iostream>
#include <sys/file.h>

using namespace std;

int main(int argcchar *argv[])
{
    
FILE listFile, * sourceFile, * destFile;
    
char filename[100], chdir_path[150], * bufferdestination[250];
    
int lSizecur_pos;
    if (
argc == 2)
    {
        
listFile fopen (argv[1], "r");
    }
    else
    {
        
listFile fopen ("files.txt","r");
    }
    if (
listFile != NULL)
    {
        if (
fgets dir_pathsizeof dir_pathlistFile ) != NULL /* read album description */
        
{
            
dir_path[strlen(dir_path)-1]='\0';
            
cout << "Trying to create directory '" << dir_path << "'.\n";
            if (!
mkdir(dir_path))
            {
                
cout << "Directory '" << dir_path << "' successfuly created.\n";
                while ( 
fgets filenamesizeof filenamelistFile ) != NULL /* read a line */
                
{
                    
filename[strlen(filename)-1]='\0';
                    
sourceFile fopen(filename,"r");
                    if (
sourceFile != NULL)
                    {
                        
// obtain file size:
                        
fseek (sourceFile SEEK_END);
                        
lSize ftell (sourceFile);
                        
rewind (sourceFile);
                        
sprintf(destination"%s%s%s"dir_path "\\" filename);
                        
destFile fopen(destination"wb");
                        if (
destFile != NULL)
                        {
                            
buffer = (char*) malloc (sizeof(char)*lSize);
                            
cur_pos 0;
                            while(
cur_pos lSize)
                            {
                                
fread (buffer11sourceFile);
                                
fwrite(buffer11destFile);
                                
cur_pos ftell(sourceFile);
                            }
                            
cout << "\tOK\n";
                            
free(buffer);
                        }
                        else
                        {
                            
cout << "Error"<< endl;
                        }
                        
fclose destFile );
                    }
                    else
                    {
                        
cout << "Error, source file cannot be opened: " << filename << endl;
                    }
                    
fclose sourceFile );
                }
            }
            else
            {
                
cout << "Error creating directory. Either you do not have permissions\nor directory already exist." << endl;
            }
        }
        else
        {
            
cout << "Error getting album description. Selection file empty?" << endl;
        }
    }
    else
    {
        
cout << "Error! No selection list file found (default: snlist.txt)";
    }
    
fclose listFile );
    
system("PAUSE");
    return 
0;    



ניסיתי לשנות את לולאת הקריאה והכתיבה שתיקח יותר מ char אחד בכל פעם (למעשה, ניסיתי לקרוא בבת-אחת את כל הקובץ, ואז לכתוב אותו בבת-אחת לקובץ החדש) אבל זה לא עובד לי.
קוד PHP:
 #include <sys/stat.h>
#include <sys/types.h>
#include <cstdlib>
#include <iostream>
#include <sys/file.h>

using namespace std;

int main(int argcchar *argv[])
{
    
FILE listFile, * sourceFile, * destFile;
    
char filename[100], chdir_path[150], * bufferdestination[250];
    
int lSizecur_pos;
    if (
argc == 2)
    {
        
listFile fopen (argv[1], "r");
    }
    else
    {
        
listFile fopen ("files.txt","r");
    }
    if (
listFile != NULL)
    {
        if (
fgets dir_pathsizeof dir_pathlistFile ) != NULL /* read album description */
        
{
            
dir_path[strlen(dir_path)-1]='\0';
            
cout << "Trying to create directory '" << dir_path << "'.\n";
            if (!
mkdir(dir_path))
            {
                
cout << "Directory '" << dir_path << "' successfuly created.\n";
                while ( 
fgets filenamesizeof filenamelistFile ) != NULL /* read a line */
                
{
                    
filename[strlen(filename)-1]='\0';
                    
sourceFile fopen(filename,"r");
                    if (
sourceFile != NULL)
                    {
                        
// obtain file size:
                        
fseek (sourceFile SEEK_END);
                        
lSize ftell (sourceFile);
                        
rewind (sourceFile);
                        
cout << "source file size: " << lSize << endl;
                        
cout << "Copying file " << filename << " ...";
                        
sprintf(destination"%s%s%s"dir_path "\\" filename);
                        
destFile fopen(destination"wb");
                        if (
destFile != NULL)
                        {
                            
buffer = (char*) malloc (lSize);
                            while (
fgets (bufferlSizesourceFile ) != NULL)
                            {
                                
fputs (bufferdestFile );
                                
cout << sizeof (buffer); 
                            }
                            
cout << "\tOK\n";
                            
free(buffer);
                        }
                        else
                        {
                            
cout << "Error"<< endl;
                        }
                        
fclose destFile );
                    }
                    else
                    {
                        
cout << "Error, source file cannot be opened: " << filename << endl;
                    }
                    
fclose sourceFile );
                }
            }
            else
            {
                
cout << "Error creating directory. Either you do not have permissions\nor directory already exist." << endl;
            }
        }
        else
        {
            
cout << "Error getting album description. Selection file empty?" << endl;
        }
    }
    else
    {
        
cout << "Error! No selection list file found (default: snlist.txt)";
    }
    
fclose listFile );
    
system("PAUSE");
    return 
0;    


אשמח אם מישהו יתקן אותי איפה טעיתי, או יציע לי פתרון אחר להעתקת קבצים בצורה מהירה בשפות ++C / C.
תודה מראש
_____________________________________
בברכה, מתן.
www.MatanNarkiss.com


נערך לאחרונה ע"י Narxx בתאריך 11-12-2011 בשעה 12:48.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 11-12-2011, 14:47
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 1 שנכתבה על ידי Narxx שמתחילה ב "[עזרה] בעיה עם תוכנית בשפת C - העתקת קבצים"

קודם כל, תחליט:
  • C או CPP? אתה אומר C, כותב קוד שנראה כמו C, אבל משתמש ב-cstdlib ולא ב-stdlib.h
  • אתה רוצה משהו שיעבוד על כל פלטפורמה, או רק על POSIX?
ב-CPP אתה יכול להשתמש במשהו (cross-platform) כזה: http://stackoverflow.com/questions/...-c-or-c#3512380 (זה כנראה פחות יעיל: http://blog.emptycrate.com/node/264).

בלינוקס אתה יכול להשתמש בכל מיני זוועות כאלה (בלי CPP) שמצאתי בגוגל, אבל אני לא באמת מכיר: http://www.c.happycodings.com/Gnu-Linux/code6.html
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה(קרדיט למרשי)
אמר לה ינאי מלכא לדביתיה אל תתיראי מן הפרושין ולא ממי שאינן פרושין אלא מן הצבועין שדומין לפרושין שמעשיהן כמעשה זמרי ומבקשין שכר כפנחס

אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #7  
ישן 11-12-2011, 15:07
  cesium cesium אינו מחובר  
 
חבר מתאריך: 28.10.11
הודעות: 337
בתגובה להודעה מספר 1 שנכתבה על ידי Narxx שמתחילה ב "[עזרה] בעיה עם תוכנית בשפת C - העתקת קבצים"

אני לא מבין למה הלולאה הפנימית משתמשת בfgets/fputs.

fgets זו פונקציה טובה לקריאת קבצי טקסט, אבל ממש לא לקבצים בינאריים ובכלל לא למקרה הזה. במקרה של ההעתקה, fgets תקרא רק עד n\ אם יש, ואז אתה לא בדיוק יודע כמה תווים יש במחרוזת בלי להריץ strlen יקר, ואתה צריך לבדוק אם צריך להוריד את הn\ האחרון או לא ושאר בלגן. ומה אם הקובץ מכיל 0\ים ואתה כותב עם fputs? בקצרה, זה לא יעבוד כך.

אני חושב שהכי פשוט בC/POSIX יהיה לכתוב לולאת read/write, ופסטן כבר קישר לתפלצת mmap (אבל מה קורה אם אתה רץ על 32-bit וגודל הקובץ הוא מעל 4 GB?).

נ.ב. בגלל שbuffer מוקצה דינאמית, הsizeof יחזיר רק את גודל המצביע...

נערך לאחרונה ע"י cesium בתאריך 11-12-2011 בשעה 15:10.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #9  
ישן 11-12-2011, 16:53
  cesium cesium אינו מחובר  
 
חבר מתאריך: 28.10.11
הודעות: 337
בתגובה להודעה מספר 8 שנכתבה על ידי פסטן שמתחילה ב "הבעיה של הגודל תהיה גם עם..."

ציטוט:
במקור נכתב על ידי פסטן
הבעיה של הגודל תהיה גם עם read/write ולא רק עם mmap - בכל הפונקציות הפרמטר הוא size_t (כמו ב-mmap וב-read/write) או int (כמו ב-lseek שמשמש בדוגמה עם ה-mmap כדי ליצור קובץ בגודל הדרוש), ושניהם בדרך-כלל 32-ביט בקומפיילרים של 32-ביט.


הוא משתמש בלולאה בכל מקרה, זה קל (ומוטב) לכתוב אותה כך שהוא יקרא למשל (8192) BUFSIZ כל פעם במקום לקרוא את כל הקובץ, כך שאין בעיה מהותית בread/write.
אבל mmap ממפה את הקובץ לכתובות ובמערכת 32-ביט (ללא PAE) יש מגבלה קשיחה ל4GB (בד"כ פחות, כי הקרנל תופסת אזור זכרון). אולי אפשר לתקן עם פרמטר offset, אבל זה off_t שיהיה 32-ביט גם כן, אלא אם הסביבה תומכת במשהו כמו _POSIX_V6_ILP32_OFFBIG (זכור לי שמערכות חדישות דיו בפלטפורמות מקובלות כן תומכות בזה).
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #10  
ישן 11-12-2011, 17:49
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 1 שנכתבה על ידי Narxx שמתחילה ב "[עזרה] בעיה עם תוכנית בשפת C - העתקת קבצים"

היי חברה'.
פסטן, זה לא באמת משנה לי אם זה C או ++C, אני בסך הכל רוצה exe שיעשה את העבודה. מה קורה מאחורי הקלעים פחות משנה לי (וכיוון שהסביבה שלי יודעת להדר גם C וגם ++C, כל פתרון היה מתקבל בברכה).
וזה גם עונה על השאלה השניה בנוגע ל cross platrorm. היה מגניב לו זה היה מתקמפל כמו שצריך גם בלינוקס וגם בחלונות, אבל השימוש העיקרי (אם לא היחיד) של זה יהיה בחלונות כך שקיצורי דרך ועיגולי פינות שיעבדו רק על חלונות מספיק טובות לי (במקרה הזה).

שובי, תודה על הכיוון. השתמשתי באמת בשגרה copy של ה-system באופן הבא:
קוד PHP:
 sprintf(destination"%s%s%s"dir_path "\\" filename);
                        
destFile fopen(destination"wb");
                        
sprintf(copy_command"%s %s %s""copy"filenamedestination);
                        
system(copy_command); 

בניתי במחרוזת את הנתיב לקובץ החדש ובמחרוזת נוספת את הפקודה copy source_file destination_file והרצתי אותה בתוך system.
זה באמת עובד משמעותית יותר מהר. ממש סגר לי את הפינה, חסך לי לולאה והתעסקות עם באפרים

תודה לכם, אלופים
_____________________________________
בברכה, מתן.
www.MatanNarkiss.com


נערך לאחרונה ע"י Narxx בתאריך 11-12-2011 בשעה 18:18.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #20  
ישן 17-12-2011, 13:20
  Dunbar Dunbar אינו מחובר  
 
חבר מתאריך: 17.12.11
הודעות: 123
בתגובה להודעה מספר 1 שנכתבה על ידי Narxx שמתחילה ב "[עזרה] בעיה עם תוכנית בשפת C - העתקת קבצים"

שלום,

קודם כל כן, המרכאות‏ עוברות פירסוס בCMD , כל מה שבין מרכאות מגיע כפרמטר אחד ל פרטמטר השני של הMAIN.

דבר שני, אני לא מבין למה אתה עושה עבודה של סקריפט בCPP . זה מסובך סתם. אם אתה רוצה פתרון נוח פשוט ו Cross Platform, תנסה שפת סקריפט. לדוגמה העתקת קבצים בפייתון:
קוד:
import shutil shutil.copyfile('/dir/file.ext', '/new/dir/newname.ext')


יש לך גם Perl , ו PowerShell (רק ווינדוס), ואפילו CMD...

דבר שלישי, אם אתה ממש ממש רוצה להעתיק קבצים בתוך אפליקציה, אז תעשה את זה דרך מערכת ההפעלה. בדיוק כמו ששובי הציע CopyFileEx()‎ . העתקת קבצים זאת פעולה שיש בה המון מקום לאופטימיזציה ביחוד במערכת קבצים Journaled, וכשאתה עושה את זה לבד, אתה למעשה מבטל את זה.

ואם אתה רוצה להעתיק קבצים מתוך CPP נכון, ו Cross Platform אתה מוזמן להשתמש בזה :
http://www.boost.org/doc/libs/1_48_...3/doc/index.htm
הנה ה Reference :
http://www.boost.org/doc/libs/1_48_....html#copy_file
שים לב לסוגי ה Copy

- - - - -
אה ל XCOPY יש מגוון שלם של בעיות (תקיות גדולות, נתיבים מעל 255 תווים, ועוד) תשתמש ב RoboCopy במקום
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #21  
ישן 17-12-2011, 17:37
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 20 שנכתבה על ידי Dunbar שמתחילה ב "שלום, קודם כל כן, המרכאות‏..."

היי.
א. כן, שמתי לב שהמרכאות עובדות ב CMD. ניסיתי וראיתי שבאמת עובד. בהתחלה לא חשבתי שזה יעבוד.
ב. למה אני עושה ב ++C עבודה של סקריפט?
ובכן, אני רציתי runnable (או executable, איך שלא אומרים את זה) שירוץ בלי פריימוורק. דאבל קליק וזהו.
היה לי קצת רקע ב ++C / C אז חשבתי שאם יש פתרון מהיר בשפות הללו, אוכל להשתמש בו וגם לקסטם אולי הודעות למשתמש תוך כדי ריצה.
לו רציתי לכתוב בשפת סקריפט שממש היתה לי נוחה, הייתי משתמש ב php, אבל זה מחייב אותי להרץ את הסקריפט בסביבה של php ואני לא רוצה להפעיל שום דבר מלבד קובץ הריצה שלי.

בסוף השתמשתי ב copy הרגיל והוא עובד לי טוב (כפי שכבר כתבתי מעלה).
כרגע אני לא רואה בעיות איתו, אבל אם תצביע על בעיות אפשריות בשימוש ב copy (שוב, בהנחה שאני מריץ רק ב windows ולא יהיה מצב שמישהו יריץ את זה על אפל או לינוקס), אשמח לשמוע ולהשתמש באלטרנטיבות...
_____________________________________
בברכה, מתן.
www.MatanNarkiss.com

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 15:46

הדף נוצר ב 0.19 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר