دسته بندی ها
20:14 1401/07/21

اجرای فایل بدون نوشتن آنها روی هارد دیسک در سی شارپ

مشخصات سوال کننده :
کاربر : mojtabahakimian     امتیاز کاربر : 155     رتبه کاربر : 10
دسته بندی : WPF سی شارپ Entity Framework Sql Server

به این سوال امتیاز بدهید    1
تعداد بازدید این سوال : 2145
هوش مصنوعی

پاسخ هوش مصنوعی

برای اجرای فایل ها مستقیماً از دیتابیس بدون ذخیره سازی آن ها روی هارد دیسک در برنامه C# WPF، می توانید از یک استریم (Stream) استفاده کنید و این استریم را به یک پروسس (Process) اعمال کنید. در زیر یک مثال ساده از این روش آورده شده است:

using System;
using System.Diagnostics;
using System.IO;
using System.Data.SqlClient;

private void ExecuteFileFromDatabase(int fileId)
{
    byte[] fileData = null;

    using (SqlConnection conn = new SqlConnection("your_connection_string"))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand("SELECT FileData FROM YourTable WHERE Id = @Id", conn))
        {
            cmd.Parameters.AddWithValue("@Id", fileId);
            fileData = (byte[])cmd.ExecuteScalar();
        }
    }

    if (fileData != null)
    {
        using (MemoryStream ms = new MemoryStream(fileData))
        {
            // اینجا فرض می کنیم فایل تصویری است (مثل jpeg)
            // باید نوع MIME فایل را تعیین کنید
            string tempFilePath = Path.GetTempFileName();
            string fileExtension = ".exe"; // تغییر دهید با توجه به نوع فایل
            string finalFilePath = Path.ChangeExtension(tempFilePath, fileExtension);

            File.WriteAllBytes(finalFilePath, ms.ToArray());

            Process.Start(finalFilePath);
        }
    }
    else
    {
        MessageBox.Show("فایل یافت نشد.");
    }
}

در این کد:

  • ابتدا اتصال به دیتابیس برقرار می شود و سپس فایل بر اساس ID انتخاب شده بازیابی می شود.
  • فایل به صورت باینری به یک استریم حافظه (MemoryStream) تبدیل می شود.
  • یک فایل موقت ایجاد می شود و بایت های فایل به آن نوشته می شود.
  • در نهایت فایل با استفاده از Process.Start اجرا می شود.

توجه داشته باشید که در اینجا باید نوع فایل را بررسی کنید و بر اساس آن اکستنشن (.exe، .pdf و ...) را تغییر دهید. استفاده از TempFilePath یک راه حل موقت است، اما می توانید راهکارهای بهینه تری نیز به کار ببرید.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 21:32 1401/07/21

این نکته رو طبق تجربه ای که در این زمینه دارم بهتون میگم.

اونم اینکه اگر قصد دارید انواع و اقسام فایلها رو در پروژتون ذخیره داشته باشید بهتره فایلها توی خود دیتابیس ذخیره نشن چون حجم بسیار زیادی در دیتابیس میگیرن و سرعت بازیابی اطلاعات بسیار پایین میاد و قطعا بعد از مدتی هنگی های زیادی پیش میاد.

اما اگر هدفتون اینه که فایلهاتون روی Hard Disk کپی نشن و مستقیم فایلها روی Ram باز بشه (دقت کنید که فایلها بعد از بازیابی از دیتابیس باید حتما یا در هارد یا در Ram نوشته بشن.)  باید از فایل dll مخصوص این کار یعنی BXSDK32.DLL استفاده کنید. این فایل رو میتونید از این لینک دانلود کنید.

ویرایش شده در پنج شنبه 21 مهر 1401 ساعت 21:33:00
به این پاسخ امتیاز بدهید    2
امتیاز: 1635 رتبه: 2
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود