romansy

مشروع برنامج لتقسيم ودمج الملفات (للمبتدئين)

51 ردود في هذا الموضوع

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

فكره المشروع :

برنامج لتقسيم الملفات ودمجها ،،

سوف نقسم الملف اعتمادا على الحجم أو على عدد الملفات المطلوبة . مثلا لدينا ملف 10 ميغا اذا قسمناها اعتمادا على الحجم 2 سوف تكون لدينا 5 أقسام من الملف ، واذا قسمناه على العدد مثلا 2 سوف يكون لدينا 5 أقسام كل منها بحجم 2 ميغا .. على ما أظن التقسيم اعتمادا على الحجم فكره عملية أكثر من العدد؟ حيث هناك مواقع تتطلب ملفات بأحجام معينه لذلك هذا التقسيم سوف يفيد أكثر ،،

بالنسبة للدمج سيتم دمج الملفات كلها لينتج الملف الأصلي كما هو بدون لا نقصان ولا زيادة ..

التقنية المستخدمه :

بالنسبة لي أفضل C++ I/O File Stream أو Win32 File Management API ، يمكن لمن يريد استخدام مكتبات أخرى ..

المطلوب في النهايه لنا جميعا :

بناء كلاس Splitter يستقبل الملف وحجم القسم الواحد ويقوم بتقسيم الملف ..

وبناء كلاس Merger يستقبل الأقسام كلها ويخرج الملف الأصلي .

وعمل واجهه بسيطه للبرنامج (عن نفسي سأستخدم Win32 API) للمستخدم النهائي ..

هناك بضعه مشاكل ستواجهنا عند الجمع (حيث يجب أن نعرف كم وأسماء الملفات المقسمه ) أين سنضع هذه المعلومات في أحد الأقسام أو قسم جديد (القسم رقم 0 مثلا !) ..

المطلوب من أي عضو الأن :

لا أعرف بالضبط :P

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

أعلم أن المشروع بسيط ، لكن أرجوا أن تكون فاتحه خير ،،

بالتوفيق :) ...

تم تعديل بواسطه Wajdy Essam
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

مشروع رائع جدا

نشكرك عليه أخى

وفى البدايه ظهرت لدى فكره وقد طبقتها والحمد لله اعتقد انها نجحت

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Splitter
{
public:
Splitter(string nameOfFile,int sizeOfPart);
private:
string name;
ofstream* fout;
ifstream* fin;
};
Splitter::Splitter(string nameOfFile,int sizeOfPart)
{
name=nameOfFile;
char c;
char temp[20];
string newName;
int n=0,suffix=0;
fin=new ifstream;
fin->open(nameOfFile.c_str());
while(!fin->eof())
{
fin->get(c);
n++;
fout=new ofstream;
newName=nameOfFile+itoa(suffix,temp,10);
fout->open(newName.c_str(),ios::app);
fout->put(c);
if(n==sizeOfPart)
{
n=0;
suffix++;
}
}
}
int main()
{
Splitter s("a.txt",10);
return 0;
}

طبعا هذا كود مبدأى

ولتجربته انشأ ملف تكست وضع فيه عدد من الحروف

وأختار حجم الأجزاء وشوف النواتج

والجزء الأخير هو باقى الملف

وشكرا مره تانيه لصاحب الفكره

سلام

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الفكره جميله

سأقوم بعمل header يتم وضعه فى كل من الملفات التى تم تقسيمها و هو يحتوى على رقم الملف (ترتيبه فى التقسيم) و عدد الأقسام و ايضا guid الملف الأول حتى استطيع التعرف عليه

-- اضافات

امكانية وجود باسورد لحماية الملف و بالطبع سيتم وضع الـ hash الخاص بها و تشفير كل جزء من الملفات بإستخدام الباسورد

سؤال : هل من الممكن استخدام Dot Net Framework مع C++

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ...

فكرة رائعة جداً أخي وجدي. لدي اختبار يوم الاثنين, و لكن إن شاء الله بعده سأبدأ بتصميم برنامجي البسيط لهذه الفكرة :)

الـ header الخاص بالملفات المقسمة ليس مشكلة. يمكنك أيضاً إضافة CRC في بداية كل ملف للتحقق من أنه سليم.

بإذن الله ابدأ في التصميم يوم الإثنين,

تحياتي أخي وجدي.

تم تعديل بواسطه Khaled.Alshaya
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جميل جدا , وياريت لو كانت هناك إمكانية ليعمل على linux لأننا نحتاجه صراحة في الإدارة :D يعني options ال command prompt تكون جاهزة .

وشيء إضافي لو كان هناك option لعمل بعثرة لجزء من هدر كل قسم , بحيث لايمكن لأي شخص فكه إلا بالبرنامج . أو أي فكرة أخرى ....

وشكرا :wub:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ...

جميل جدا , وياريت لو كانت هناك إمكانية ليعمل على linux لأننا نحتاجه صراحة في الإدارة biggrin.gif يعني options ال command prompt تكون جاهزة .

وشيء إضافي لو كان هناك option لعمل بعثرة لجزء من هدر كل قسم , بحيث لايمكن لأي شخص فكه إلا بالبرنامج . أو أي فكرة أخرى ....

ما رأيك يا هيثم بأن تضع مواصفات و نقوم بالعمل على تطبيقها ؟

أعتقد أن المشروع سيصبح أسهل و افضل هكذا. ماهي خيارات التقسيم التي تقترحها ؟

هل تريد تشفير الملفات الناتجة ؟

هل تريد أن تكون الـ meta-data الخاصة بعملية جمع الأجزاء في ملف منفصل ؟

هل نستغني عن عملية التشفير بعملية ضغط, و تصبح معلومات الأجزاء في ملف منفصل يمكن تشفيره دون استهلاك الموارد في تشفير أجزاء الملف الأصلي خصوصاً في حالة كون حجمه كبيراً, و الأجزاء الناتجة نقوم بضغطها بخوارزمية سريعة ؟

ماهو حجم الملفات التي تريد تقسيمها بشكل عام, و هل عدد الأجزاء كبير أم تريد تقسيم الملف إلى أجزاء قليلة ؟

هل يوجد مفسر python لديكم على السيرفر بحيث يمكننا بناء الدوال بـ ++C و ربطها عن طريق boost ؟

مشروع جميل جداً, أتمنى أن يكون فاتحة خير :)

تحياتي ...

تم تعديل بواسطه Khaled.Alshaya
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ايه كل ده :o

انا مفتحتش الموضوع من ساعتين و ارجع الاقى كل الإضافات دى :cry:

طب نخلص الفكره بشكلها الأساسى و بعد كده نضيف زى ما احنا عايزين

انا شغال فيه دلوقتى بقالى حوالى 3 ساعات

ارجو ان الإضافات متضرنيش اعيد كتابة الكود من تانى

على العموم انا هكمل فى النسخه اللى معايا و لما نستقر على حاجه ممكن اعدل فيه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

الشكر موصول لأخى صاحب الفكره

قمت بعمل تصور مبدأى للكلاسين Splitter , Merger

وقمت بتجربتهم

ولكنهم أعتقد يحتاجا الكثير من التطوير

فى الكلاس Splitter يتم تمرير اسم الملف المراد تقسيمه وحجم التقسيم

وفى Merger

يتم تمرير اسم الملف الأصلى و الأسم الجديد الذى تريده بعد التجميع وكذلك يمكن وضع

path

جديد

ويوجد به داله لحساب حجم كل جزء اثناء عملية التجميع

معكم الكود المبدأى


#include <fstream>
#include <string>
using namespace std;
class Splitter
{
public:
Splitter(string nameOfFile,int sizeOfPart);
private:
string name;
ofstream* fout;
ifstream* fin;
};
Splitter::Splitter(string nameOfFile,int sizeOfPart)
{
name=nameOfFile;
char c;
char temp[20];
string newName;
int n=0,suffix=0;
fin=new ifstream;
fin->open(nameOfFile.c_str());
if(!(*fin)) { cout<<" error in openning file \n"; exit(0); }
while(!fin->eof())
{
fin->get(c);
if(fin->eof()) break;
cout<<c;
n++;
fout=new ofstream;
newName=nameOfFile+itoa(suffix,temp,10);
fout->open(newName.c_str(),ios::app);
fout->put(c);
if(n==sizeOfPart)
{
n=0;
suffix++;
}
}
}
class Merger
{
public:
Merger(string,string);
int getsize(string);
private:
ofstream* fout;
ifstream* fin;
};
int Merger ::getsize(string name)
{
fin=new ifstream;
fin->open(name.c_str());
fin->seekg(0,ios::end);
return fin->tellg();
}
Merger::Merger(string nameOfFile,string target)
{

ifstream ftemp;
int suffix=0;
string name,ntemp;
char temp[20];
char c;
int n=0;

while(1)
{
ntemp=nameOfFile+itoa(suffix+1,temp,10);
ftemp.open(ntemp.c_str());
if(! ftemp) break;
ftemp.close();
name=nameOfFile+itoa(suffix,temp,10);
fin=new ifstream;
fin->open(name.c_str());
if(!(*fin)) { cout<<" file : "<<name<<" not found \n"; break;}
fin->seekg(n);
fin->get(c);
n++;
fout=new ofstream;
fout->open(target.c_str(),ios::app);
fout->put(c);
if(n == getsize(name))
{
suffix++;
n=0;
}


}

}
int main()
{
//Splitter s("a.txt",5);
Merger m("a.txt","c:\\m.txt");
return 0;
}
#include <iostream>

طبعا ينقصه الكثير مثل دوال الهدم واضافة الهيدرات للملفات وكذلك يمكن اضافة تشفير للأجزاء

تحياتى

تم تعديل بواسطه amin_mu123
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

فكرة جميلة :)

لي تعليق هنا :

هناك بضعه مشاكل ستواجهنا عند الجمع (حيث يجب أن نعرف كم وأسماء الملفات المقسمه ) أين سنضع هذه المعلومات في أحد الأقسام أو قسم جديد (القسم رقم 0 مثلا !) ..

لماذا لا نضع المعلومات في اسم الملفات .

مثلا لو كان الملف المراد تقسيمه هو qtsdk2009 ، تكون اسماء الاجزاء بهذا الشكل :

packet_qtsdk2009_filesize_currentPos

حيث file هو حجم الملف الاصلي ، وال currentPos هو عنوان البداية للملف المقسم .

وعندما يبدأ ال Merger بالعمل فانه يقرأ ال filesize ويبدا من currentPos = 0

وهكذا..

ٍساحاول ان أطبق بكيوتي :)

الى اللقاء.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أعتقد أن المشروع سيصبح أسهل و افضل هكذا. ماهي خيارات التقسيم التي تقترحها ؟

هل تريد تشفير الملفات الناتجة ؟

هل تريد أن تكون الـ meta-data الخاصة بعملية جمع الأجزاء في ملف منفصل ؟

هل نستغني عن عملية التشفير بعملية ضغط, و تصبح معلومات الأجزاء في ملف منفصل يمكن تشفيره دون استهلاك الموارد في تشفير أجزاء الملف الأصلي خصوصاً في حالة كون حجمه كبيراً, و الأجزاء الناتجة نقوم بضغطها بخوارزمية سريعة ؟

ماهو حجم الملفات التي تريد تقسيمها بشكل عام, و هل عدد الأجزاء كبير أم تريد تقسيم الملف إلى أجزاء قليلة ؟

هل يوجد مفسر python لديكم على السيرفر بحيث يمكننا بناء الدوال بـ ++C و ربطها عن طريق boost ؟

جميل جدا برنامج تفصيل مجانا :D

بالنسبة للتشفير ليس بالضرورة أن يكون شيء معقد , فالفكرة أننا لانريد بعض المتطفلين من شركة الإستضافة لكي يعرفو محتويات الملفات الموجودة .

أحجام الملفات كبيرة , قد تصل ل 4 جيجا بشكل عادي .

بالنسبة لل meta-data يحبذ أن تكون في الملفات نفسها لكي لايكون هناك حمل إضافي على نقل الملفات .

بالنسبة للضغط أعتقد أنه شيء صعب قليلا على المشروع , ولا إيه ! وفي نفس الوقت يمكن أن نضغط في السيرفر بال gz ونقسم المضغوط بعدها بالبرنامج .

يوجد مفسر بايثون في السيرفر نعم .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

فكرة جميلة من الحبيب وجدي :) .

هناك عوائق أظنها ستواجه المشروع .. مثل :

- مشكلة endianness أو byte order .. في حال عمل النظام على أنظمة مختلفة تعمل على معالجات مختلفة ... هل ستواجهنا هذه المشكلة ؟

قمت بعمل تصور مبدأى للكلاسين Splitter , Merger

وقمت بتجربتهم

ولكنهم أعتقد يحتاجا الكثير من التطوير

المشكلة أن الاخ هيثم يريد التعامل مع ملفات بحجم 4 جيجا :D .. لذلك عملية فتح الملف وقراءة وكتابة بايت بايت أمر مكلف ؟! لذلك يجب أن نقلل من عملية القراءة والكتابة من والى وسائط التخزين .. كما تعلم .

لذلك الحل هو أن نقرأ على دفعات ( مثل : أصغر من أو يساوي 100 ميجا .. لكل عملية قراءة وكتابة من والى الملفات ) ..

- أما بالنسبة لمشكلة أين نضع الـ meta-data ، فأقترح اضافة في كل ملف وصف للملف الذي يعتمد عليه مثال :

الملف الاول يحوي على اسم وحجم الملف الثاني .

الملف الثاني يحوي على اسم وحجم الملف الثالث .

وهكذا حتى آخر ملف .. الذي يشير للملف الاول .

والهدف حتى نقلل حجم الـ meta-data قدر الامكان .. ويمكن اعادة تجميع الملفات انطلاقاً من أي ملف .

أما وضع الوصف في ملف واحد .. يؤدي الى زيادة عدد الملفات .. ولو ضاع الملف الخاص بالـ meta-data .. انتفت فائدة الملفات الاخرى .. أما وضع المعلومات كأسماء للملفات , فأظن أنها غير عملية , لانه من الممكن تغيير اسم الملف بيد عابثة :-)

المطلوب من أي عضو الأن :

لا أعرف بالضبط

أن يثرثر حتى نصل الى الحل المطلوب :D .

تم تعديل بواسطه الشمري
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي HGB

هناك برنامج Hjsplit يعمل على اللينكس هنا :thumb_up: .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

فعلا أخى عملية قراءة الملف بايت بايت وكذلك الكتابه أمر غير عملى

خصوصا مع الملفات الكبيره

وأنا معك فى قراءة الملف على هيئة كتل بإستخدام الدوال read و الكتابه بالداله write

والتخذين فى وسائط ( مصفوفات حرفيه )

نفس فكرة البفر buffer

ان شاء الله سأحاول وفكرة ان يحتوى كل ملف على بيانات الملف الذى بعده رائعه

تشبة القائمه المتصله الدائريه

وأعتقد اننا يجب أن نضيف بيانات الملف الأول فى كل جزء حتى نستطيع الوصول اليه من أى ملف جزئى

تحياتى لك أخى الشمرى ولكل من يشارك فى هذا الموضوع الجميل

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

ما شاء الله ، اللهم زد وبارك :) ..

أخي أمين جربت مثالك على ملف a.txt وقسمته 500 بايت وأنشأ البرنامج ملفين a.txt0 وb.txt1 ولكن الملفين فارغين (0 بايت) ! هل حدث لك هذا أمر لي فقط ،، أتحدث عن محاولتك الأولى أما الثانيه فلم أجربها بعد . ومحاولة جميلة أخي الكريم :) .

أما بالنسبة لمشكلة أين نضع الـ meta-data ، فأقترح اضافة في كل ملف وصف للملف الذي يعتمد عليه مثال :

الملف الاول يحوي على اسم وحجم الملف الثاني .

الملف الثاني يحوي على اسم وحجم الملف الثالث .

وهكذا حتى آخر ملف .. الذي يشير للملف الاول .

والهدف حتى نقلل حجم الـ meta-data قدر الامكان .. ويمكن اعادة تجميع الملفات انطلاقاً من أي ملف .

جميل جدا ،، ولكن كيف ستعرف أن الملف الحالي هو الملف الأول ؟؟

فكرتي للHeader بأن يكون من قسمين ،،

القسم الأول عام لكل الملفات ومحتواه عباره عن اسم الملف * حجمه * الهاش md5 sum للملف وهكذا لبقية الملفات .

القسم الثاني من الHeader يكون خاص للملف وفيه الهاش الخاص به ..

هكذا من خلال النظر للقسم الخاص من الهيدر وأخذ الهاش ومن ثم النظر للقسم العام ومعرفه موقع الهاش سنعرف أن هذا الملف هو الملف الأول أو الثاني .

طبعا يمكن أن يكون الهاش md5 sum أو CRC لا مشكله ،،

بالنسبة للتعامل مع الملفات ذات الأحجام الكبيره فلا مشكله ، يمكن أن نحلها باستخدام دوال Memory Mapping File حيث توفر لنا القرائه من الملف مباشره وهو على القرص وبدون رفعه الى الذاكرة ، ولكن استخدام هذه الدوال لن يجعل البرنامج portable كما يريد هيثم .. أو الحل الأخر هو قرائه ما نريد للقسم فقط من الملف في الذاكرة وليست قرائه الملف بالكامل ..

ربما تكون الفكره غير جيده ، وفي انتظار أرائكم ،،

بالتوفيق :) ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ...

بالنسبة للتعامل مع الملفات ذات الأحجام الكبيره فلا مشكله ، يمكن أن نحلها باستخدام دوال Memory Mapping File حيث توفر لنا القرائه من الملف مباشره وهو على القرص وبدون رفعه الى الذاكرة ، ولكن استخدام هذه الدوال لن يجعل البرنامج portable كما يريد هيثم .. أو الحل الأخر هو قرائه ما نريد للقسم فقط من الملف في الذاكرة وليست قرائه الملف بالكامل ..

هذه هي المشكلة الحقيقية التي سأحاول حلها بعدما أنتهي من اختباراتي :S

إذا كانت الملفات كبيرة أكبر من 2 GB, فهذا يعني مشكلة في الـ streams. لأن الـ streamsize حسب علمي 32bit. هذا عندي فقط :)

سأرى وثائق GCC إن شاء الله, و أعتقد أن الـ streamsize عبارة 64bit لمترجمهم لمعالجات 64bit.

لا أعتقد أننا سنحتاج إلى Memory Mapping, لأننا سنقوم بقراءة متسلسة, كل ما نحتاج إليه هو ضبط الـ buffer إلى حجم معين يلائم النظام. و حتى لو كان الـ Memory Mapping جيد فهناك طريقة portable :wink:

تحياتي ...

تم تعديل بواسطه Khaled.Alshaya
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
جميل جدا ،، ولكن كيف ستعرف أن الملف الحالي هو الملف الأول ؟؟

فكرتي للHeader بأن يكون من قسمين ،،

القسم الأول عام لكل الملفات ومحتواه عباره عن اسم الملف * حجمه * الهاش md5 sum للملف وهكذا لبقية الملفات .

القسم الثاني من الHeader يكون خاص للملف وفيه الهاش الخاص به ..

بالنسبه للـ header فيأخذ الشكل التالى فى النسخه التى اعمل عليها


struct FileHeader
{
char* Signature;
GUID MainGUID;
uint FileParts;
uint PartID;
ulong FileSize;
ulong OriginalSize;
uint PassHash;
};

حيث الـ Signature هو حرفين يمثلوا بصمه للملف و الـ MainGUID تمثل رقم لا يتكرر للملف الأول و هى توضع بداخل كل الملفات حتى استطيع الوصول للملف الأول و الـ FileParts هو عدد الملفات و PartID هو رقم الملف الحالى بعد التقسيم و FileSize هو مساحة هذا الجزء من الملف بعد التقسيم و OriginalSize هو مساحة الملف بعد تجميعه و PassHash يحتوى على hash الخاص بالباسورد

و بالتالى و حتى ان كان يوجد اكثر من ملف فى نفس الفولدر و كانوا ذو اسماء مختلفه فالتعامل يكون مع الـ header و الذى يحتوى على اسم فريد لا يتكرر و ايضا يحتوى على جميع البيانات التى تجعله يصف نفسه.

تم تعديل بواسطه محمد علاء الدين
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
md5 sum أو CRC لا مشكله ،،

ممكن سؤال ... لماذا نحتاج لهذه ؟

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

جميل جدا ،، ولكن كيف ستعرف أن الملف الحالي هو الملف الأول ؟؟

لا أظن هذا مهم ؟!

بالمناسبة أخي وجدي .. من الجميل أن نطبّق ما كتبته في موضوع : مقدمة الى التحليل والتصميم .. نريد أن نرى ذلك بشكل عملي .. اذا لم يؤثر ذلك على سير المشروع .

تم تعديل بواسطه الشمري
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

ما أعرفه أنها تستخدم للتحقق من أن الملف سليم .. أثناء نقله مثلاً عن طريق الشبكة ( لم يحدث قلب للبتات ).. لكن كيف ستسفيد منه هنا

تخيل قسمنا الملف لقسمين a.txt و b.txt ،، وقام المستخدم بحذف ملف a.txt واضافة a.txt بنفس حجم الملف الأول ، الان اذا لم تتأكد من البيانات أنها لم تتغير سيتم الدمج مع ملف غير صحيح ،، لذلك التأكد من البيانات لم تتغير ضروري ، وأسهل طريقة هي باستخدام الهاش ..

جميل جدا ،، ولكن كيف ستعرف أن الملف الحالي هو الملف الأول ؟؟

لا أظن هذا مهم ؟!

بالطريقة الدائريه التي قلتها ، تخيل لو المستخدم بعد فتحه صندوق الحوار لكي يختار الملف باختيار الملف الثاني والثالث الى الأخير ؟ هل ستتم عملية الدمج بطريقتك ؟ نعم لأن الثاني يربط الى الثالث والثالث الى الرابع وهكذا ... يجب أن تتأكد بطريقة أن كل الملفات موجوده وبطريقتك هذه لن تعرف الملف الأول هل موجود أم لا ..

بالمناسبة أخي وجدي .. من الجميل أن نطبّق ما كتبته في موضوع : مقدمة الى التحليل والتصميم .. نريد أن نرى ذلك بشكل عملي .. اذا لم يؤثر ذلك على سير المشروع

يا زول انتا داير تورطني ولا شنو :lol: :lol:

والله التحليل مهم بالطبع في البرامج الكبيره والمتوسطه أيضا ،، عن نفسى لم أطبقه بشكل عملي نهائيا لأني لم أقم بمشروع عملي من الأساس :P على العموم البرنامج الذي في أيدينا بسيط وقد لا يحتاج تصاميم وخططات أو تحليل مكثف خاصه أن المهام المطلوبة في البرنامج قليله ،، على العموم أذا أردتوا ذلك فلا مانع ، ويمكن أستشاره الأخ Sudanix فهو جيد في الOOAD . (لا تهرب يا *nix :P ) ..

بالتوفيق أخي الكريم :) .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي محمد كلامك جميل جدا ،،

لكن لم أفهم MainGUID ؟

لـ MainGUID تمثل رقم لا يتكرر للملف الأول و هى توضع بداخل كل الملفات حتى استطيع الوصول للملف الأول

هل تعني أنها فقط أشاره الى أن الملف الحالي هو الملف الأول ، أم ماذا ؟؟

اذا كانت كذلك الا يمكن أن تكون متغير boolean (نعم \ لا) ..

بالنسبة لبصمه الملف ؟ فباستخدام md5 sum سينتج هاش بطول 128 بت (16 بايت) .. مثلا اذا استخدمنا crc 32 سيكون على ما أذكر بطول 32 بت (4 بايت ) ،،

بالتوفيق :) ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
لكن لم أفهم MainGUID ؟

اعتذر لقد اسئت الشرح

الـ MainGUID هو بصمه تعريفيه لكل اجزاء الملف بمعنى يوجد لدينا ملف تم تقسمه على 3 اجزاء و ملف اخر تم تقسيمه على جزيئن و اسماء الملفات غير متشابه فمثلا اول 3 ملفات اسمائهم ABC.bin ، WXC.bin ، XXM.bin و الملفين الأخرين هما FGH.bin ، BIN.bin السؤال الأن كيف ستقوم بمعرفة الثلاثة ملفات التى سيتم تجميعهم فى ملف واحد ؟ سيتم ذلك عن طريق الـ GUID حيث ان الـ 3 ملفات لهم GUID واحد فقط بالإضافه لترتيب الملف فى التقسيم PartID و حيث اننا يوجد لدينا FileParts لذا نستطيع معرفة الملفات الغير موجوده.

بالنسبة لبصمه الملف ؟ فباستخدام md5 sum سي ئ2Aج هاش بطول 128 بت (16 بايت) .. مثلا اذا استخدمنا crc 32 سيكون على ما أذكر بطول 32 بت (4 بايت ) ،،

لم اقصد ببصمة الملف الـ hash الخاص بمحتوياته و لكن اقصد tag للـ header من الممكن ان يحتوى على نوع الملف و اصداره فمثلا انا استخدم FM1 و هى تدل على File Manager v1.

و الله ولى التوفيق

تم تعديل بواسطه Muhammad alaa
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي HGB

هناك برنامج Hjsplit يعمل على اللينكس هنا :thumb_up: .

نستخدم split في لنكس حاليا , لكن ليس آمن بما فيه الكفاية وهو متوفر في أي مكان ويمكن من ال header الخاص به أن تستطيع تمييز نوع البرنامج , البرنامج التفصيل الذي يريد الشباب إنجازه سيكون فيه بعثرة أو تشفير خفيف بحيث لايمكن معرفة محتوى البيانات أيضا حتى لو قرئت مباشرة بإستخادم محرر نصوص .

هذه صورة من split

post-19273-1249257365_thumb.png

split -b SIZE_IN_BYTE filename_to_splt.ext

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

قمت بتجربة برنامج HJSplit 2.4 من هنا ، ومن الأساس لا يوجد أي هيدر في الملفات المقسمه ،، فقط يقسمها على حسب الحجم الى القسم الأول 001 والثاني 002 وهكذا ...

عند الجمع يجبرك على أختيار الملف الأول 001 (من الDialogBox) وبعدها يقوم هو باستخراج بقية الملفات بنفسه (يجب أن تكون في نفس المسار) ،،

لكن البرنامج لا يتحقق من أي ملف قمت بالتغيير فيه ، فسيتم دمجه فقط بما انه هو الملف التالي 002 .

واذا حذفت مثلا ملف في الوسط 003 فسيقوم بدمج 001 و 002 فقط ..

واضح أنه يعمل حلقة لكي يقرأ الملفات بدء من 001 وانتهاء بأخر رقم بشكل متسلسل .. جمع أعمى Blinder Joiner :P

فالسؤال يا هيثم في مرحله الدمج هل تريد البرنامج يتحقق من البيانات في الملف وأنها لم تتغير ، أم فقط يدمجها مع البقية ؟

أيضا في مرحلة التقسيم ذكرت :

البرنامج التفصيل الذي يريد الشباب إنجازه سيكون فيه بعثرة أو تشفير خفيف بحيث لايمكن معرفة محتوى البيانات أيضا حتى لو قرئت مباشرة بإستخادم محرر نصوص

وهي معلومة مهمه يجب الوقوف عليها والحديث حولها بشكل جيد (أقصد للشباب المشاركين) ..

بالتوفيق :) .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

محاوله جديده على التقسيم والدمج

والحمد لله جربتها على ملفات التكست والصور ونجحت

واستخدمت فيها فكرة البفر buffer

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Splitter
{
public:
Splitter(string nameOfFile,int numOfPart);
int getSize(string);
private:
string name;
char* buffer;
ofstream* fout;
ifstream* fin;
};
int Splitter::getSize(string name)
{
fin=new ifstream;
fin->open(name.c_str());
fin->seekg(0,ios::end);
return fin->tellg();
}
Splitter::Splitter(string nameOfFile,int numOfPart)
{
int sizeOfPart=getSize(nameOfFile.c_str())/numOfPart;
int remain=getSize(nameOfFile.c_str())-(numOfPart-1)*sizeOfPart;
cout<<remain<<endl;

name=nameOfFile;
char temp[20];
string newName;
int suffix=0;
fin=new ifstream;
fin->open(nameOfFile.c_str(),ios::binary);
if(!(*fin)) { cout<<" error in openning file \n"; exit(0); }
for(int i=0;i<numOfPart-1;i++)
{
if(fin->eof()) break;
buffer=new char[sizeOfPart];
fin->read(buffer,sizeOfPart);
fout=new ofstream;
newName=nameOfFile+itoa(suffix,temp,10);
fout->open(newName.c_str(),ios::app| ios::binary);
fout->write(buffer,sizeOfPart);
suffix++;
delete buffer;
}

buffer=new char[remain];
fin->read(buffer,remain);
fout=new ofstream;
newName=nameOfFile+itoa(suffix,temp,10);
fout->open(newName.c_str(),ios::app| ios::binary);
fout->write(buffer,remain);
delete buffer;
fin->close();
fout->close();
}
class Merger
{
public:
Merger(string,string);
int getsize(string);
private:
ofstream* fout;
ifstream* fin;
char* buffer;
};
int Merger ::getsize(string name)
{
fin=new ifstream;
fin->open(name.c_str());
fin->seekg(0,ios::end);
return fin->tellg();
}
Merger::Merger(string nameOfFile,string target)
{

ifstream ftemp;
int suffix=0;
string name,ntemp;
char temp[20];
int size;
int n=0;
fout=new ofstream;
fout->open(target.c_str(),ios::app| ios::binary);
while(1)
{
ntemp=nameOfFile+itoa(suffix,temp,10);
ftemp.open(ntemp.c_str(),ios::binary);
if(! ftemp) break;
ftemp.close();
name=nameOfFile+itoa(suffix,temp,10);
size=getsize(name);
buffer=new char[size];
fin=new ifstream;
fin->open(name.c_str(),ios::binary);
if(!(*fin)) { cout<<" file : "<<name<<" not found \n"; break;}
cout<<size<<endl;
fin->read(buffer,size);
fout->write(buffer,size);
suffix++;
delete buffer;

fin->close();
}
fout->close();
}
int main()
{
//Splitter s("b.jpg",3);
Merger m("b.jpg","new.jpg");
return 0;
}

يجب استدعاء الكائنين بشكل منفصل

تحياتى

تم تعديل بواسطه amin_mu123
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شغل طيب أخي أمين ،،وقسم الصور صحيح ،، ولكن حاليا يقسم اعتمادا على العدد والأفضل هو التقسيم على حسب الحجم ، فقم بادخال هذه الخاصية حتى يكتمل الشغل تماما ،، أيضا برنامجك استخدم نفس طريقة البرنامج في البحث عن الملفات وقد لا توجد طريقة غير هذه اذا لم يتواجد header به معلومات الملفات ،، أو أن تدلها بنفسك عليه ،، كما قمت في محاولتي البسيطة :) ...

محاولتى مخصصه لأنظمه ويندوز لأني أستخدام Win32 API وتقسيم الملف يكون بادخال عدد البايتات (طبعا أمر مرهق اذا كان البرنامج بالGB لذلك يجب أن نضع خيار للتقسيم اما بKB أو MB أ, GB ) . ثانيا عند تقسيم أي ملف سيأخذ نفس اسم الملف الأصلي - (رقم القسم) ثم الإمتداد SPLITTER . وعند الدمج نمرر أسماء الملفات المراد دمجها وسيتم الدمج (أعمى حاليا :) )ويخرج الملف النهائي بنفس إسم الملف الأصلي والإمتداد

لن أضع المحاولة حتى نكمل النقاش في النقاط المهمه :

1) الهيدر وتقريبا الهيدر الذي اقترحه الأخ محمد جيد ،،

2) طريقة التشفير أو البعثره وكيف ستكون ، وأين سنخزن طريقة الفك في الهيدر أم ...

3) قرائه الملفات الكبيره جدا ..

النقطه 3 حليتها في محاولتي وأيضا أظن محاولة الأخ أمين وأي شخص سيلجأ لهذا الحل وهو بقرائه أجزاء صغيره من الملف Small Chunks وليس بقرائه الملف بالكامل ، أي سنقوم نقرأ مثلا من الملف 1GB حوالي 10 ميغا ثم نقوم بكتابتها في الملف الأول ، ونقرأ ال10 MG الثانية ونكتبها في الملف الثاني .. وهكذا ..

المخرج النهائي للأداه يجب ان تكون سهله للإستخدام سواء console utility او gui ، حاليا في النسخ الكونسولية :) يجب استخدام الoption لانه يسهل في استخدام البرنامج أحسن من التصليح فيه ثم اعاده الترجمه والتشغيل مره أخرى ...

C:)app.exe

error in usage , try app.exe -h

C:)app.exe -h

To Split : app.exe -s file.ext size

To Merege : app.exe -m file1.ext ...

C:)app.exe -s PSDK.iso 500000000

The File PSDK.iso have Size : 1394618368

And will be partition into many files with size : 500000000

operation done successfully....

C:)app.exe -m PSDK.iso-1.SPLITTER PSDK.iso-2.SPLITTER PSDK.iso-3.SPLITTER

Merging done successfully...

C:)

بالتوفيق :) .

تم تعديل بواسطه Wajdy Essam
مشكل بسيط :)
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مجهود مبارك من الأخوة،

لدي تدخل بسيط في موضوع ال Header و التعرف على الملفات

حيث يمكن عمل ذلك بشيئ شبيه بال FAT (وهو ما أشار له الأخ الشمري)، الفكره أن يكون في ال Header مؤشر إلى الملف التالي

بمعنى

File Title: AZ9FG68FAJ9
Next File Header : AVAEV45HR

كما يكون الملف الأخير يشير إلى الملف الأول

و عند التجميع يتم النظر إلى ال Headers الخاصة بالملفات و يتم التجميع بناء على التسلسل

طبعا في هذه الحالة نكسب إمكانية التجميع إنطلاقا من أي ملف

طبعا القيم يتم إنشاءها بشكل عشوائي أو بأي طريقة أخرى (أو حتى يمكن الإعتماد على البيانات التي تكون في بداية الجزء) او 10 بايت مثلا

بالتوفيق

تم تعديل بواسطه *خلدون خالد*
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .