View Full Version : سوال: ذخیره سازی فایلها در جداول (روش لینک یا روش ذخیره سازی مستقیم؟)
ali190
یک شنبه 21 آذر 1389, 18:39 عصر
باسلام و عرض خسته نباشید
دوستان من دارم یک برنامه مینویسم که با فایلها فایلهای آفیس ، اتوکد ، و...) سرروکار زیاد داره
فر کنید من یک جدول یک به چند دارم ، که در جدول مادرم خصوصیات یک سیستم رو بصورت رکورد تعریف میکنم
حالا میام به اون رکورد که با جدول دیگه ام ارتباط یک به چند داره رکوردهایی رو اختصاص میدم که این رکوردها در جدول چند همون فایلهای من هستند
در اینجا دوبحث مطرح میشه:(در ضمن بانک اطلاعاتی بنده sql server2000 هست)
1-ذخیره سازی لینک در جدول چند
این کار باعث بالا رفتن سرعت کار میشه ولی باید یک پوشه ای باشه که این پشوه برای همه کاربران share شده باشه که همه بتونن از این برنامه تحت شبکه استفاده کنن
چند سئوال در اینجا پیش میاد :
الف:
دسترسی این پوشه برای افراد مختلف چطوری تعیین میشه؟ (آیا تنظیمت مربوط به permission پوشه باید برای تک تک کاربران تعریف بشه)
ب:
چون جداول من ارتباط یک به چند دارند ، طبیعتاً زمانیکه من رکورد پدر از جدول یک رو حذف کنم ، رکوردهای جدول چند که فرزندادن رکورد پدر جدول یک من هستند هم پاک میشن ، خوب این وسط تکلیف اون فایلها که در پوشه به اشتراک گذاشته شده هستند چی میشه ، درسته با یک delete رکوردهای حاوی لینک حذف شده است ولی تکلیف خود فایلهای چی میشه؟
2- ذخیره سازی مستقیم فایلها در جدوال sqls erver
اصلاً در این مورد هیچ اطلاعی ندارم
اگر میشه یک نمونه بذارید که با چه تکنیکی میشه فایل رو از طریق vb (پنجره common diablog) در جداول sql server ذخیره سازی کرد؟
اگر فایلها در جدوال به صورت مستقیم ذخیره بشه آیا امکانش هست که اون فایل ذخیره شده در vb رو مستقیم مثلاً با یک دکمه open نمود ؟
یه جا شنیده بودم که برنامه هایی نوشته شده است (مثل بعضی از نرم افزارهای اتوماسیون اداری) که با نصب یان برنامه در سیستم یوزر انواع و اقسام viewer های نرم افزار های مختلف بر روی سیستم کاربر نصب میشه وکاربر رو در اجرای بسیاری از فایلها از نصب اون نرم افزار بی نیاز میکنه
اگر امکانش هست در مورد این مباحث ، که در برنامه نویسی هیا تحت شبکه کاربرد فراوانی داره یه مقدار بحث کنیم ، باشد که مفید واقع بشه
یاعلی
vbhamed
جمعه 26 آذر 1389, 12:54 عصر
سلام
فرض كنيد دو تا جدول داريد كه هر كدوم در حقيقت مشخصات فايل هاي شما هستند
البته منظورم جدول پدر و فرزند نيست بلكه دو تا فرزند، مثلا شما براي عكسهاي مختلف يك شخص يك جدول و براي نامه هاش يك جدول ديگه تعريف كردين كه اين دو تا خودشون به يك جدول پدر اصلي متصل ميشن
حالا قراره براي هر ركورد يك يا چند فايل در پوشه اشتراكي كپي بشه
يك قانون نامگذاري فايل براي خودتون در نظر بگيريد
مثلا براي عكسهاي شخص، قانونش اين ميشه :
"Picture-" + Id + Numberو نمونه اسم فايل عكسهاي يك شخص :
Picture-100-000
Picture-100-001
Picture-100-002
Picture-100-003كه در بالا عدد 100 همون Id ركورد هست و عدد 000 تا 003 شماره فايلها
و براي نامه هاي شخص، قانونش اين ميشه :
"Mail-" + Id + Numberو نمونه اسم فايل نامه هاي يك شخص :
Mail-100-000
Mail-100-001
Mail-100-002
Mail-100-003
كه در بالا عدد 100 همون Id ركورد هست و عدد 000 تا 003 شماره فايلها
حالا روي هر ركوردي كه بريد مي تونيد نام فايلهاي عكس و نامه هاي وي رو تشخيص بدين
اينطوري نياز به هيچ فيلدي براي ذخيره سازي مسير نامه يا عكس شخص هم نداريد يعني فضاي مصرفي 0 بايت براي هر تعداد فايل و نامه !
البته توصيه من اينه كه حتما يك فيلد Boolean به ازاي هر نوع فايل (نامه، عكس و ...) بزاريد تا مشخص كنه كه اين ركورد اون نوع فايل رو داره يا نه بزاريد مثلا IsPicture, IsMail, ...
اين فيلد بعدا به خيلي درد مي خوره، البته بسته به نياز مي تونيد فيلدي هم بزاريد كه تعداد هر نوع فايل رو ذخيره كنه
خب حالا به پاك كردن ركورد مي رسيم
شما يك ركورد پدر با مثلا Id برابر 1 داريد
كه اين پدر خودش 2 فرزند با Id هاي 100 و 101 داره
قراره ركورد پدر پاك بشه
ابتدا ليست Id فرزندان رو بدست بياريد
سپس نام فايلها رو تشكيل بدين و اونها رو پاك كنيد كه بازم قانون خودش رو داره مثلا براي عكسها ميشه :
"Picture-" + Id + "*.*"مثلا
Picture-100-*.*حالا ميشه با يك دستور ساده فايلهاي بالا رو در پوشه مربوطه پاك كرد
Kill "C:\Test\Picture-100-*.*"و بعد هم ركورد پدر رو پاك كنيد
البته باز توصيه من اينه كه اول نام فايلهايي رو كه قراره پاك بشه رو تشكيل بدين، سپس ركورد پدر رو پاك كنيد و اگر درست پاك شد بعد خود فايلها رو پاك كنيد
اين قانون براي بكاپ يا كپي گرفتن از يك ركورد به همراه فايلهاي ضميمه هم مي تونه استفاده بشه
پسوند فايلهاي ضميمه رو دست نزنيد چون مي تونيد نام فايل رو به تابع ShellExecute از توابع API بدين تا خودش با توجه به پسوند فايل رو با برنامه مرتبط باز كنه
ضمنا من اصلا ذخيره فايل در خود بانك اطلاعاتي رو توصيه نمي كنم
اما از جهت امنيتي مي تونيد فايلهاي روي هارد ديسكتون رو انكريپت كنيد تا هيچ شخصي نتونه به محتواش دسترسي داشته باشه، ضمنا مي تونيد فشردشون كنيد تا حجم كمي هم اشغال كنند، خيلي از اكتوايكس هاي مربوط به فشرده سازي كار انكريپ سازي رو هم همزمان انجام مي دن، در حقيقت ميشه گذاشتن پسورد براي فايل فشرده
ali190
جمعه 26 آذر 1389, 13:56 عصر
سلام
جناب Vbhamed عزیز ممنون از راهنماییتون
خیلی خیلی عالی بود
اين قانون براي بكاپ يا كپي گرفتن از يك ركورد به همراه فايلهاي ضميمه هم مي تونه استفاده بشه
در مورد کپی گرفتن فایل دستورش چطور میشه ؟
فرض کنید یک دسته از فایلها میخوان کپی بشن ، در دستور filecopy یک آدرس مبداء وجود داره و یک آدرس مقصد
فرض کنیم آدرس های مبداء ما
"C:\Test\Picture-100-*.*" هستند ، آدرس های مقصد ما به تناسب این فایلها چی میشه؟
اما از جهت امنيتي مي تونيد فايلهاي روي هارد ديسكتون رو انكريپت كنيد تا هيچ شخصي نتونه به محتواش دسترسي داشته باشه، ضمنا مي تونيد فشردشون كنيد تا حجم كمي هم اشغال كنند، خيلي از اكتوايكس هاي مربوط به فشرده سازي كار انكريپ سازي رو هم همزمان انجام مي دن، در حقيقت ميشه گذاشتن پسورد براي فايل فشرده
خب کار با فایلها توسط دو طیف از کاربران انجام میپذیره:
1-کاربری که این فایلها رو در سرور Upload میکنه
2-کاربری که از این فایلها استفاده میکنه
کاربری هم که از فایلها استفاده میکنه نیز دوس دسته هستند:الف)فردی فایل رو open میکنه جهت مشاهده ب) فردی که فایل رو کپی میکنه جهت ویرایش و استفاده
منظورتون اینکه که کاربر اول که میخواد فایلها رو در سرور آپلود کنه توسط یک مکانیزم اونهارو ایتدا انکریپت و سس فسرده سازی کنه؟
خب کاربر دوم که میخواد فایل رو از شبکه باز کنه باید چیکار کنه؟
باید اول اون رو از حالت فشردگی در بیاره و سپس اون رو از حالت انکریپت دربیاره و بتونه بازش کنه؟(از روی همون سرور بازش کنه)
اگر یه کاربر دیگه همزمان با کاربر دوم بخواد این کار رو بکنه چه اتفاقی میفته؟
منظورم اینکه زمانیکه کاربر میخواد یک فایل رو بگشاید آیا باید اون رو مستقیماً از روی سرور (با دو مکانیزم خارج کردن از فایل فشرده و خارج کردن از حالت انکریپت ) بگشاید یا نه و باید اون ور در سیستم خودش منتقل کند و این کار ها رو انجام دهد؟
شاید کاربر نخواهد فایل به سیستمش منتقل بشه و فقط میخواد اون رو در شبکه باز کنه و اگر مورد دلخواهش بود به سیستمش منتقل کنه
آیا در سیستم پوشه ای وجود داره که فایل بهش منتقل بشه و بعد از اینکه فایل بسته شد خود فایل سریعاً حذف بشه
در مورد امنیت فایلها ، میتونم از الگوریتم hush (هش کردن فایل) استفاده کنم؟
اکتیوایکسی مه هم انکریپت کنه و هم فشرده سازی کنه رو نیافتم!
ممنون و متشکر از توضیحات مبسوط شما
یاعلی
vbhamed
جمعه 26 آذر 1389, 22:49 عصر
سلام
در مورد كپي فرض كنيد روي ركوردي با Id برابر 100 هستيد و قراره ركورد جديدي ايجاد بشه كه Id اون برابر 200 هست پس دستور ميشه
FileCopy "C:\Test\Picture-100-000.jpg","C:\Test\Picture-200-000.jpg"يعني دستور كپي رو بهتره براي تك تك فايلهاي ضميمه جداگانه انجام بدين
در مورد دوم هم قرار نيست كاربر خودش به صورت دستي فايل رو فشرده يا انكريپت كنه و مهم نيست كاربر ادمين باشه يا نه فقط مهم اينه كه اجازه ديدن فايل رو داشته باشه، در حقيقت برنامه خودش موقع نمايش يك فايل اون رو از حالت فشرده در مياره و اگر فشرده پسورد دار هم باشه باز هم برنامه اين كار رو انجام مي ده
براي اين كار هم معمول اينه كه در يك پوشه ديگه فايل نهايي باز ميشه و ازش استفاده ميشه، اما اگر نخواين فشرده سازي انجام بدين مي تونين خود فايل رو از طريق برنامتون به روشهاي مختلف انكريپت كنيد
ساده ترين راه XOR كردن كدهاي اسكي كارامترهاي فايل با يك عدد خاص هنگام انكريپت و XOR مجدد با همون عدد هنگام ديكريپت هست يعني متد انكريپت و ديكريپتتون يكي هست، البته اين يك روش خيلي ساده و قابل فهميدنه ولي مي تونيد خودتون پيچيدش كنيد، اينطوري ديگه فايل دوم يا فايل موقتي ايجاد نميشه و عمليات روي خود فايل اصلي انجام ميشه
روش قبلي در شبكه بهتره چون هر كاربري يك نسخه موفتي با نام دلخواه براي خودش ايجاد و از اون استفاده ميكنه و مشكل تداخل در دسترسي به فايل اصلي پيش نمياد، ضمنا اگر كاربر نخواد روي دستگاه خودش فايل موقت رو ايجاد كنه مي تونه اين كار رو روي سرور انجام بده و از نام فايلي استفاده كنه كه قبلا موجود نباشه تا با ساير كاربران تداخل پيش نياد هر چند اگر روي دستگاه خودش باشه بهتره
اكتيوايكس قدرتمند XceedZip هم مي تونه به شما كمك كنه
اينم سايت اصلي http://www.xceed.com
ali190
شنبه 27 آذر 1389, 00:00 صبح
سلام جناب vbhamed عزیز
يعني دستور كپي رو بهتره براي تك تك فايلهاي ضميمه جداگانه انجام بدين
در مورد کپی کردن فایلها یه فکری به سرم زد
فیلد مربوط به لینک فایلها در رکوردستم رو توسط یک حلقه ، کپی بگیرم
اینجوری همه لینکهام ازشون کپی گرفته میشه
اما اگر نخواين فشرده سازي انجام بدين مي تونين خود فايل رو از طريق برنامتون به روشهاي مختلف انكريپت كنيد
آیا هش کردن یک فایل هم یک جور encrypt کردن فایل هست؟
میشه از این روش استفاده کنم؟
براي اين كار هم معمول اينه كه در يك پوشه ديگه فايل نهايي باز ميشه و ازش استفاده ميشه،
میشه بفرمائید منظور از پوشه نهایی کجاست؟
این پوشه تو کجا تعریف بشه بهتره
فرض کنید یک کاربر میخواد یه فایل رو ببینه
اون فایل باید ابتدابه یه جا کپی بشه ، سپس از حالت فشردگی دربیاد ، سپس از حالت رمزنگاری دربیاد ، سپس توسط دستورات shell گشوده بشه (یعنی 4 مرحله)
خب این فایل باید کجا کپی بشه که بعد از دیدن فایل توسط کاربر خود فایل و فایل زیپ حذف بشه؟
اگر یه کاربر دیگه همزمان بخواد همون فایل رو ببینه چه اتفاقی میفته؟ خوب اون فایل در اون پوشه نهایی هستش ، پس کاربر دیگه ای که میخواد همون فایل رو ببینه دیگه نمیتونه اون 4 مرحله رو در اونجا انجام بده
میشه در این مورد یه مقدار با جزئیات بیشتر توضیح بدید ، ممنون میشم
اكتيوايكس قدرتمند XceedZip هم مي تونه به شما كمك كنه
آیا این اکتیوایکس فقط زیپ میکنه ، یا در حین زیپ انکریپت هم میکنه؟
خیلی خیلی ممنون از نظرات کارشناسانه شما
یاعلی
vbhamed
شنبه 27 آذر 1389, 11:41 صبح
سلام
Hash با انكريپت فرق داره، در مورد هش به منبع زير مراجعه كنيد ولي من تعريف كلي اون رو اينجا مي زارم
Hash کدها به طور خلاصه کدهايي هستند بر اساس الگوريتمهايي که با محاسبات بر روي فايل ها توليد مي شوند. يعني طبق يک سري الگوريتم هايي که بر روي فايلها محاسبات انجام ميدهند براي آنها يک کد يکتايي خاصي (Unique) توليد ميکنند. اين کد در صورتي که حتي يک bit از آن فايل عوض شود، تغيير مي کند. به اين کدها به طور کلي هش کد Hash Code مي گويند و چون هيچ دو فايلي Hash کدي همانند هم ندارند (مگر آنکه هردو يک فايل باشند ولي با نامهاي متفاوت و يا مکان هاي متفاوتي) بنابر اين، مي توان Hash کدها را همانند اثر انگشت ما انسانها دانست.
براي بازگشايي هم نياز به 4 مرحله كار نيست، فقط يك مرحله اونم اينكه از روي فايل اصلي فايل نهايي بازگشايي و در همون حين بازگشايي ديكريپت هم ميشه، اون اكتيوايكسي كه معرفي كردم مي تونه يك فايل فشرده ايجاد يا باز كنه با پسورد يا بدون اون، همه در يك مرحله
كاربران مختلف هم مي تونن براي راحتي كار تو پوشه اشتراكي، پوشه ديگه اي به اسم خودشون داشته باشن و عملياتشون رو در اون پوشه انجام بدن تا با بقيه كاربران تداخل نداشته باشن
ali190
شنبه 27 آذر 1389, 12:46 عصر
باسلام جناب vbhamed
منظورتون از انکریپت و زیپ کردن فایل ، یعنی همون عملیاتی که بصورت دستی توسط نرم افزار winrar انجام میدیم مثل بعضی از سایتها که ازشون فایل دانلود میکنیم برای گشودنشون از کاربر پسورد میخواد؟
كاربران مختلف هم مي تونن براي راحتي كار تو پوشه اشتراكي، پوشه ديگه اي به اسم خودشون داشته باشن و عملياتشون رو در اون پوشه انجام بدن تا با بقيه كاربران تداخل نداشته باشن
زماینکه یه فایل زیپ و انکریپت شده میخواد باز بشه ، (طبق متد استفاده از پوشه شخصی یک کاربر) باید ابتدا اون فایل زیپ شده در مکان پوشه مورد نظر محتویاتش رو خالی کنه (unzip و دی انکرپیت) و بعد از ریختن فایل مورد نظر در پوشه مقصد فایل برای کاربر گشوده بشهتمام این عملیات با این هدف انجام شده که کاربر فقط فایل رو ببینه و بعد از اتمام کار هم اون رو ببندهولی زمانیکه کاربر فایل ر وبست چه اتفاقی میفته؟فایلی که دی انکریپت و unzip شده همونطور در اون پوشه باقی میمونه؟راه دیگه ای برای این روش وجود نداره؟
ممنون و متشکر از توضیحات شما
یاعلی
vbhamed
شنبه 27 آذر 1389, 21:42 عصر
سلام
انكريپت كردن يعني كدهاي اسكي يك فايل رو به روشهاي مختلف به رمز در بياريم
ولي Hash ايجاد يك كليد يا كد يا عدد از روي يك فايل هست كه مي تونه به عنوان امضاء فايل تلقي بشه و بسته به نوع الگوريتم مورد استفاده هيچ دو فايل متفاوتي، امضاء يكساني ندارند
براي مثال فرض كنيد قراره يك فايل انكريپت بشه
با يك روش خيلي ساده ما به جاي هر يك از كاراكترهاي درون فايل كاراكتري با كد اسكي همون كاراكتر + 2 رو مي زاريم مثلا رشته ABC تبديل به CDE ميشه يعني A به C و B به D و C به E
اينطوري وقتي فايل باز بشه قابل خوندن نيست و بايد ابتدا ديكريپت بشه
اما در مورد هش قضيه چيز ديگري است، فرض كنيد قراره رشته ABCDE هش بشه
قانونش دلخواهه اما روشهاي استاندارد متقارن و نا متقارن وجود داره
تو مثال بالا به شكل نمونه زير عمل مي كنيم
65*1+66*2+67*3+68*4+69*5
در عبارت بالا عدد 65 كد اسكي حرف A و 66 كد حرف B و الي آخر هستند
ما كد اسكي هر كاراكتر رو در موقعيت كاراكتر در جمله ضرب كرديم (اين يك قانون دلخواه است)
طول فايل هر چقدر هم كه باشه حاصل عبارت بالا نهايتا يك عدد ميشه و اين عدد براي اين فايل با فايلي ديگه حتما فرق داره مگر در موارد بسيار نادر كه با اين الگوريتم هش ساده خيلي مهم نيست، در عمل شما مي تونيد عمليات هاي ديگه اي انجام بدين
عدد حاصل رو هش فايل يا امضاء ديجيتال فابل مي گن
پس طبق توضيحات بالا انكريپت كردن محتويات يك فايل رو كد مي كنه كه كسي نتونه بفهمه چيه
ولي هش مشخص مي كنه كه فايل ما همون فايل اصلي هست يا تغيير داده شده، اين مورد مخصوصا براي فهميدن اينكه فايلمون ويروسي شده يا نه يا اينكه كسي برناممون رو كرك كرده يا نه مي تونه مفيد باشه
در مورد اون اكتيوايكس هم سايت سازنده خودش مثال داره
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.