PDA

View Full Version : ایجاد فایل متنی رو هوا و نوشتن در آن و ایجاد امكان save‌ كردن آن توسط كاربر



majid_darab
پنج شنبه 11 شهریور 1389, 01:16 صبح
keywords = Export , notepad , Text , File , Memory , Ram , asp.net, csharp , Read, Write

با سلام و عرض خسته نباشید خدمت تمامی دوستان :
سوال اول :
آیا این امكان وجود دارد كه یك فایل متنی را در رم (ram = memory) سرور ایجاد نموده و مواردی را در آن بنویسیم ؟ چگونه ؟

سوال دوم :
آیا این امكان وجود دارد كه یك فایل متنی را در رم (ram = memory) كلاینت ایجاد نموده و مواردی را در آن بنویسیم ؟ چگونه ؟

سوال سوم‌:
چگونه می توان فایل متنی ایجاد شده ی بالا را ( كه یا در رم سرور یا در رم كلاینت یا در هارد سرور ایجاد گردیده) در اختیار كاربر قرار داد؟
یعنی :
الف) یا یك فایل notepad untitled باز كنیم و محتویات فایل بالا رو در اون جای گذاری كنیم و در نهایت كاربر این اختیار را داشته باشد كه اونو به دلخواه خود در جایی از هارد دیسكش ذخیره نماید (آیا شدنی است ؟ چگونه؟)
ب) اگر فایل رو هارد سرور ایجادشده باشد بهش لینك بدیم كه این روش منطقی و درست است . اما هدف بررسی موارد دیگر می باشد. در ضمن این فایل رو (كه هر دفعه محتویات اون قراره تغییر كنه) كی پاك كنیم كه تو هارد سرور شلوغ نشه؟
ج) به شیوه ای دیگر فایل را در اختیار كاربر قرار دهیم.(EXPORT) چگونه‌؟ (این مورد هدف مورد نظر می باشد)

با تشكر از راهنمایی و توجه دوستان

Alireza_Salehi
پنج شنبه 11 شهریور 1389, 01:31 صبح
کار منابع قابل خواندن و نوشتن از طریق کلاس Stream و کلاسهای منشعب از آن انجام می شود چه یک فایل فیزیکی باشد یا یک اتصال شبکه باشد و ...
1. بنابرای اصل خواندن و نوشتن در جایی مبتنی بر Stream است، کلاسی به نام MemoryStream وجود دارد که در رم ذخیره می شود که عملکرد آن دقیقا مانند یک Stream است و می توانید مشابه یک فایل از آن بخوانید و در آن بنویسید و سپس آن را به فایل یا شبکه و هر جای دیگری منتقل کنید.

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

2. وقتی شما با جاوا اسکریپت کار می کنید در واقع از رم کلاینت استفاده می کنید بنابراین یک متغییر متنی در جاوااسکریپت می تواند نقش یک فایل متنی را بازی کند.

3. اگر روی سرور باشد به راحتی می تواند محتویات StringBuilder یا MemoryStream را در یک فایل txt بر روی سرور ذخیره کرد و امکان دانلود آن را برای کاربر ایجاد نمود.
امکان ذخیره سازی هیچ فایلی در سیستم کلاینت وجود ندارد، تنها فایل قابل ذخیره در کلاینت کوکی است که حداکثر حجم آن 4 کیلوبایت است و برای این منظور مناسب نیست.

majid_darab
پنج شنبه 11 شهریور 1389, 02:15 صبح
از شب زنده داری و پاسخ جنابعالی به شدت قدردانی می كنم...
من در رابطه با مورد بالا كد زیرو گیر آوردم كه بعضی از قسمتهاش برام روشن نیست ...
اگر راهنمایی بفرمایید ممنون می شوم:



public void Page_Load(object sender, EventArgs e)
{

byte[] buffer;
using (var memoryStream = new System.IO.MemoryStream())
{
buffer = Encoding.Default.GetBytes("Hello StackOverflow"); //Dummy data
memoryStream.Write(buffer, 0, buffer.Length);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=hello.txt"); //This wil force browser to silently download file. you can comment this line to see difference
Response.AddHeader("Content-Length", memoryStream.Length.ToString());
Response.ContentType = "text/plain"; //This is MIME type
memoryStream.WriteTo(Response.OutputStream);
}
Response.End();

}

Alireza_Salehi
پنج شنبه 11 شهریور 1389, 20:24 عصر
معمولا موقع خواندن و نوشتن از استریم ها به یک آرایه بایت نیاز است که نقش بافر را بازی میکند.
با توجه به این که متد Write کلاس استریم یک آرایه بایت قبول می کند و محل شروع و تعداد بایت ها نیز برای آن مهم است.

باید متنی که می خواهید ذخیره کنید به آرایه ای از بایت تبدیل گردد که برای این منظور می توانید از فضای نام System.Text.Encoding استفاده کنید، دو مورد معروف ASCII و UTF8 هستند که در اینجا از Encoding پیشفرض استفاده شده است.

در این کد بعد از این که متن مورد نظر در MemoryStream قرار گرفت مستقیما آن را برای دانلود ارسال می کند.
به این صورت که ابتدا Response پاک می شود.
بعد نوع و نام فایل از طریق سرآیند Content-Disposition به خروجی معرفی می شود و
سپس اندازه و نوع محتوای فایل.
در واقع وجود سرآیند Content-Disposition در خروجی موجب می شود که پنجره دانلود فایل در مرورگر ظاهر گردد.

در نهایت هم MemoryStream از طریق متد WriteTo به خروجی منتقل می گردد