مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

source

عضویت از 1395/11/13

مشکل با filestream

  • دوشنبه 4 شهریور 1398
  • 09:11
تشکر میکنم

سلام

از filestream برای ایجاد فایل و ذخیره 10000 بایت اولیه در اون استفاده میکنم.

سیک رو هم بعد از ذخیره میگذارم.

و بعد استریم رو میبندم.

10000 بایت بعدی رو append میکنم و با write ذخیره میکنم.

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

پاسخ های این پرسش

تعداد پاسخ ها : 17 پاسخ
کاربر سایت

salman_b

عضویت از 1396/02/18

  • سه شنبه 5 شهریور 1398
  • 10:35

سلام

آخر عملیات FileStream رو Dispose کن تا قفل سیستم عامل از روی اون فایل برداشته بشه.

کاربر سایت

source

عضویت از 1395/11/13

  • سه شنبه 5 شهریور 1398
  • 10:48

نشد متاسفانه.

کدش رو بگذاریم یه نگاه بندازی؟

کاربر سایت

salman_b

عضویت از 1396/02/18

  • سه شنبه 5 شهریور 1398
  • 13:55

بگذار

کاربر سایت

source

عضویت از 1395/11/13

  • سه شنبه 5 شهریور 1398
  • 14:05

این کدشه. یه توضیح بدم:

مثلا یه فایل 100 مگابایتی ویدئو دارم. این رو اومدم تبدیل کردم به base64 . بعد هر بار 500 بایتش رو ارسال میکنم به سرور.

حالا میخوام این رو مستقیما روی سرور ذخیره و تبدیل به ویدئو کنم. (بدون ذخیره در کش و sql و ...). مستقیم.

                if (System.IO.File.Exists("/001/test" + "." + fileextention))
                {
                    using (FileStream fileStream = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.None))
                    {
                        for (int i = 0; i < dataArray.Length; i++)
                        {
                            fileStream.WriteByte(dataArray[i]);
                            fileStream.Close();
                        }

                    }
                }
                else
                {

                    using (FileStream fileStream = new FileStream(fileName, FileMode.Create))
                    {
                        for (int i = 0; i < dataArray.Length; i++)
                        {
                            fileStream.WriteByte(dataArray[i]);
                            fileStream.Close();
                        }

                    }
                }

گیر کردم انصافا.

ممنونم.

کاربر سایت

salman_b

عضویت از 1396/02/18

  • سه شنبه 5 شهریور 1398
  • 19:15

دلیلش اینه که fileStream رو قبل از اینکه کارش تموم بشه داری Close میکنی

کاربر سایت

source

عضویت از 1395/11/13

  • سه شنبه 5 شهریور 1398
  • 19:32

خب ببین فایله 100 مگه.

هر بار 1024 بایت با آجاکس ارسال میشه سمت اکشن.

یعنی اکشنم 1000 بار rerun میشه.

کاربر سایت

salman_b

عضویت از 1396/02/18

  • سه شنبه 5 شهریور 1398
  • 19:47

اولا اینکه نمیدونم چرا اصن اینکار رو میکنی!

چون خود asp mvc واسه دانلود و آپلود فایل مکانیزم داره و خودش به صورت توکار stream فایل رو ذخیره میکنه. به هر حال شاید مورد خاصی رو داری پیاده میکنی.

ببین اون dataArray رو داری میگی که 1024 بایت هستش و توی حلقه داری بایت به بایت میخونی و ذخیره میکنی. باید ۱۰۲۴ بایت رو بخونی و در نهایت stream ٰرو ببندی نه اینکه یه بایت رو خوندی و stream رو بستی خب اینجا exception میگیری دیگه.

تو اصن نیازی به fileStream.Close نداری. زمانی که از بلاک using میاد بیرون خودکار Dispose میکنه.

کاربر سایت

source

عضویت از 1395/11/13

  • سه شنبه 5 شهریور 1398
  • 19:53

اوکی شد دم شما گرم.

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

الان اجبارن ازین سیکل استفاده کردم:

fileStream.Write(Convert.FromBase64String(st), 0 , Convert.FromBase64String(st).Length);

اما اگر بخوام اون استرینگ رو تبدیل به ارایه کنم و از خط کد زیر استفاده کنم بایستی چکار کنم:

for (int i = 0; i < dataArray.Length; i++)
        {
            fileStream.WriteByte(dataArray[i]);
            fileStream.Close();
        }
 

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

ممنونم از وقتی که میگذاری.

کاربر سایت

salman_b

عضویت از 1396/02/18

  • سه شنبه 5 شهریور 1398
  • 20:45

خواهش میکنم وظیفه است.

فایل ویدئو میخوای ذخیره کنی ؟
اگه ویدئو باشه که اصلا مشکلی نداره و نیاز به تبدیل به رشته متنی نداره.

کاربر سایت

source

عضویت از 1395/11/13

  • سه شنبه 5 شهریور 1398
  • 20:50

کلا فایلای حجم بالا و پایین رو...

از این خط که استفاده میکنم:

fileStream.Write(Convert.FromBase64String(st), 0 , Convert.FromBase64String(st).Length);

این باگ رو میده:

برای طول رشته ی 10000 تا... البته شایدم کمترم باشه!

Exception thrown: 'System.FormatException' in mscorlib.dll

Additional information: Invalid length for a Base-64 char array or string

کاربر سایت

salman_b

عضویت از 1396/02/18

  • سه شنبه 5 شهریور 1398
  • 20:54

منم میگم اصلا چرا میخوای st رو به رشته تبدیل کنی ؟
خب همینطوری باینری ذخیره کن دیگه.

کاربر سایت

source

عضویت از 1395/11/13

  • سه شنبه 5 شهریور 1398
  • 21:14

st از نوع استرینگه.

شما میگید همون بالا در ورودی اکشن به جای string اون رو byte بگذارم؟

کاربر سایت

salman_b

عضویت از 1396/02/18

  • سه شنبه 5 شهریور 1398
  • 21:23

آره بابا
باینری ذخیره کن. دلیلی نداره به رشته تبدیل کنی اصلا. کلی سربار پردازشی و رم و اینا داری اینطوری

بعد کلا ویدئو Base64String نیست که. اصلا نمیتونی تبدیلش کنی واسه همینم داری Exception میگیری

کاربر سایت

source

عضویت از 1395/11/13

  • چهارشنبه 6 شهریور 1398
  • 09:02

سلام

انجام دادم. استرینگ رو به بایت تبدیل کردم و 

byte[] dataArray;
                dataArray = Encoding.ASCII.GetBytes(st);

با این خط کد:

fileStream.Write(dataArray, 0, dataArray.Length);

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

کاربر سایت

salman_b

عضویت از 1396/02/18

  • چهارشنبه 6 شهریور 1398
  • 10:53

سلام

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

کاربر سایت

source

عضویت از 1395/11/13

  • چهارشنبه 6 شهریور 1398
  • 11:35

باشه ممنونم ازت.

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

source

عضویت از 1395/11/13

  • جمعه 8 شهریور 1398
  • 15:00

سلام

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

مرسی

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)