دریافت حجم فایل از اینترنت و نمایش آن در سی شارپ (C# WinForms)

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


⚠️ نکته مهم: نسخه جدیدتر این آموزش را می‌توانید در مطلب دریافت حجم فایل با استفاده از HttpClient در دات نت مطالعه کنید. لطفاً در پروژه های جدید از HttpClient استفاده کنید. آموزش زیر صرفاً جهت آرشیو در دسترس قرار گرفته است.


تابع زیر را در پروژه خود کپی کنید.

توجه داشته باشید: این آموزش بر اساس قواعد جدید سی شارپ 6.0 که در ویژوال استودیو 2015 است نوشته شده، برای استفاده در نسخه های قدیمی تر ممکنه لازم باشه تغییراتی در اون اعمال کنید.

private string GetFileSize(string xurl)
{
    try
    {
        System.Net.WebRequest req = System.Net.WebRequest.Create(xurl);
        req.Method = "HEAD";
        System.Net.WebResponse resp = req.GetResponse();
        long ContentLength = 0;
        if (long.TryParse(resp.Headers.Get("Content-Length"), out ContentLength))
        {
            long B = 0, KB = 1024, MB = KB * 1024, GB = MB * 1024, TB = GB * 1024;
            double size = ContentLength;
            string suffix = nameof(B);

            if (ContentLength >= TB)
            {
                size = Math.Round((double)ContentLength / TB, 2);
                suffix = nameof(TB);
            }
            else if (ContentLength >= GB)
            {
                size = Math.Round((double)ContentLength / GB, 2);
                suffix = nameof(GB);
            }
            else if (ContentLength >= MB)
            {
                size = Math.Round((double)ContentLength / MB, 2);
                suffix = nameof(MB);
            }
            else if (ContentLength >= KB)
            {
                size = Math.Round((double)ContentLength / KB, 2);
                suffix = nameof(KB);
            }

            return $"{size} {suffix}";
        }
    }
    catch (Exception)
    {
        return "-";
    }
    return "-";
}

چگونه کار میکند؟

تابع ابتدا با استفاده از کلاس System.Net.WebRequest از سرور، متد HEAD را درخواست می کند. سپس با استفاده WebResponse اطلاعات را دریافت کرده و سپس با استفاده از long.TryParse حجم فایل دریافتی از resp.Headers.Get("Content-Length") را به long تبدیل میکند.

تابع TryParse تلاش میکند که تبدیل را انجام داده و در ContentLength قرار دهد. نتیجه TryParse همیشه bool بوده و باید حتما کنترل شود.

در داخل بدنه if در صورتی که تبدیل موفقیت آمیز باشد حجم فایل به صورت "کاربر پسند" بازگشت داده خواهد شد. در صورتی که به این بخش نیاز ندارید در بدنه if تنها ContentLength را بازگشت دهید.

نحوه استفاده

برای استفاده از این تابع به صورت زیر عمل کنید.

string mysize = GetFileSize("لینک فایل");
این مطلب برای اولین بار در تاریخ 15 شهریور 1394 در وبلاگ پیمان محمدی منتشر شده است.
نظرات (6)
مهدیه
8 سال پیش

سلام خسته نباشین من کد بدست اوردن حجم فایل روی یک درایو رو میخوام

میتونین کمکم کنین؟

long length = new System.IO.FileInfo(path).Length;

توضیحات بیشتر:

https://www.dotnetperls.com/fileinfo-length

EhsanCR7
9 سال پیش

سلام خسته نباشید من می خواستم تو قسمت آموزش نصب ویندوز در حالت UEFIوGPTبرای کامپیوترولب تاپ کامنت بزارم..ظاهرا نمیشه کامنت گذاشت...حتی روی ایمیل شما میخواستم کامنت بزارم..مینویسه نامعتبر است... سوالاینجا مطرح میکنم..روی پی سی من ویندوز 10نصب استپارتیشن استایل من به صورت GPTاست...می خواهم ویندوز8.1نصب کنم...روششو توضیح میدین..ممنون میشم

درود - آموزش ها کاملاً واضح هستش!

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

امید
9 سال پیش

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

درود و تشکر

saeed
10 سال پیش

سلام امکانش هست سورس برنامه خودتون رو هم در انتهای هر مطلب قرار بدید.

با درود - چون این سورس جزء یه برنامه کامل هستش امکان قرار دادن سورس وجود نداره با عرض پوزش

مجتبی
10 سال پیش

خیلی ممنون از شما به کمک راهنمایی ها و مطالب سایت موفق شدم نصب کنم .دمتون گرم

خواهش میکنم ♥

مجتبی
10 سال پیش

باسلام بنده یک سوال داشتم میخواستم بدونم ویندوز من الان در حالت legacy نصب هست میخوام تغییر بدم به uefi و دوتا هارد جدا دارم یکی ویندوز و یکی هم اطلاعات شخصی خواستم بدونم هارد دیتا من هم فرمت میشه؟واسه نصب روی حالت uefi حتما باید اول هارد ویندوز رو پاک کنم ؟؟ اخه الان که میرم روی حالت uefi هیج اتفاقی نمی افته نه ویندوز قبلی میاد بالا نه اینکه دی وی دی ویندوز لود میشه که نصبش کنم . با تشکر از شما و سایت خوبتون

با درود برای نصب ویندوز در حالت UEFI فقط لازمه هاردی که ویندوز روش نصب میکنید رو به GPT تبدیل کنید. هارد دوم مثل هارد اکسترنال میمونه تفاوتی نداره نوع پارتیشن بندیش چی باشه. وقتی بوت روی UEFI باشه چون هارد اولتون که ویندوز روشه MBR هستش پس لود نمیشه همینطور DVD اگر خودش فایل های مخصوص UEFI رو همراه نداشته باشه لود نمیشه.