19 روز پیش ایجاد و دسترسی به پراپرتی فایل و پوشه
zahmah

 
سلام و وقت بخیر.
آیا میشه یک Property یا Attribute جدید برای یک فایل یا پوشه تعریف کرد? (منظورم Archive و امثال اینهاست)
ولی این Attribute جدید باشد و بشود آدرس فایل یا توضیحاتی را در آن ست کرد یا از آن خواند.
18 روز پیش
حاجی شریفی
مؤسس سایت
 
سلام
بله! البته اگر فرمت درایوتان NTFS باشد.

فایل سیستم NTFS مفهومی دارد به نام A lternate D ata S treams که اجازه میدهد برای هر فایل بینهایت اطلاعات اضافه نام دار نگهداری کنید.

برخی API های ویندوز مانند CreateFile در مسیر های NTFS و بعد نام فایل با یک کالن/دونقطه نام این stream الحاقی را دریافت میکنند.
یعنی نام ali.txt به جریان stream خود یک فایل اشاره میکند و نام ali.txt:mystream1 به جریان داده الحاقی به نام mystream1 اشاره میکند که درست مانند یک فایل قابل خواندن و نوشتن است و میتوانید هر دیتایی در آنها ذخیره کنید.

بدیهی است با Delete فایل اصلی کلیه stream ها الحاقی هم حذف خواهند شد و با Copy فایل اصلی این stream ها هم کپی میشوند.
تنها نکته در Copy فایل به درایوهای غیر NTFS است (مانند FAT32) که در این مواقع stream های الحاقی کپی نشده و به نوعی از فایل حذف میشوند.

توابع توکار دات نت مستقیم و خودکار از ADS ها پشتیبانی نمیکنند ولی در واقع هیچ مشکلی وجود ندارد.
شما میتوانید handler ها را با API های ویندوز استخراج کنید و به کلاس ها و توابع دات نت تحویل دهید و به راحتی هم کار میکند.
همچنین میتوانید از کتابخانه های dll که برای این کار نوشته شده استفاده کنید.
مانند WindowsAPICodePack یا نمونه جدیدتر Trinet.Core.IO.Ntfs و...

موفق باشید.
18 روز پیش
zahmah

 
با سلام
با تشکر از پاسخ های خوب شما

من از WindowsAPICodePack استفاده کردم و میخواستم در پراپرتی Comment آن مطلبی ست کنم اما فقط در مورد فایل های jpg امکانپذیر بود(البته نه به شکل مطالبی که در بالا گفته اید).
//Set
var shellFile = ShellFile.FromParsingName(file_path);
ShellPropertyWriter set_Property = shellFile.Properties.GetPropertyWriter();
set_Property.WriteProperty(SystemProperties.System.Comment, file_path);
set_Property.Close();

//Read
var shellFile = Microsoft.WindowsAPICodePack.Shell.ShellObject.FromParsingName(file_path);
var fileComment = shellFile.Properties.GetProperty(SystemProperties.System.Comment).ValueAsObject.ToString();


اگر امکانش باشد قطعه کدی در مورد ست کردن و خواندن پراپرتی (هم فایل و هم پوشه) بگذارید
البته همه نوع فایلی...
ببخشید!
16 روز پیش
حاجی شریفی
مؤسس سایت
 
سلام
آن موردی که شما میگویید از ویژگی های برخی File-Fromat است و عمومیت نداشته و در فرمت هایی که همچین ویژگی هایی دارند، حالت یک-شکل و یکپارچه هم ندارد.
قابلیت ADS از ویژگی های File-System خود NTFS است و به تمام فایل های روی این سیستم فایل به یک شکل اعمال میشود و مدیریت آن مستقیم بر عهده خود NTFS است.
محتویات این ADS ها جداگانه ذخیره میشوند و با محتویات فایل اصلی ادقام نمیشود و در برنامه های استفاده کننده از فایل اصلی تاثیری ندارد.
ولی خوب درهرصورت مختص NTFS است و باید پارتیشن مورد نظر چنین فرمت شده باشد.

نمونه کد با نصب بسته Trinet.Core.IO.Ntfs
void  Main()
{
System.IO.File.WriteAllText( "D:\\ali.txt", "any text ..." ) ;

//Write
var ads1 = Trinet.Core.IO.Ntfs.FileSystem.GetAlternateDataStream( "D:\\ali.txt", "mystream1", System.IO.FileMode.Create ) ;
using (var stream1 = ads1.OpenWrite())
using (var writer1 = new System.IO.StreamWriter(stream1))
{
writer1.Write( "<doc>my-data</doc>" ) ;
}

//Read
var ads2 = Trinet.Core.IO.Ntfs.FileSystem.GetAlternateDataStream( "D:\\ali.txt", "mystream1", System.IO.FileMode.OpenOrCreate ) ;
using (var stream2 = ads2.OpenRead())
using (var reader2 = new System.IO.StreamReader(stream2))
{
string data = reader2.ReadToEnd();
Console.WriteLine( data ) ;
}

Console.ReadLine();
}


نمونه کد با نصب بسته CodeFluentRuntimeClient
void  Main()
{
System.IO.File.WriteAllText( "D:\\ali.txt", "any text ..." ) ;

//Write
CodeFluent.Runtime.BinaryServices.NtfsAlternateStream.WriteAllText( "D:\\ali.txt:mystream1", "<doc>my-data</doc>" ) ;

//Read
string data = CodeFluent.Runtime.BinaryServices.NtfsAlternateStream.ReadAllText( "D:\\ali.txt:mystream1" ) ;
Console.WriteLine( data ) ;

Console.ReadLine();
}


در ضمن باید دقت کنید که برخی نرم افزار در کار با یک فایل و ویرایش آن ( مانند ویرایش فایل نمونه ali.txt ) بجای Update فایل ، خود را راحت میکنند و فایل را Delete و مجدد با اطلاعات جدید Create میکنند.
اگر فایل اصلی با همچین برنامه ای تغییر کند و Save شود ( بدلیل Delete و Create فایل مادر ) تمام stream های الحاقی فایل حذف خواهد شد.

خلاصه آنکه ، مجدد هشدار داده و یادآوری میکنم که امکان دارد بعد ویرایش و Save فایل اصلی ( با توجه به نرم افزار مورد استفاده ) به یکباره تمام stream های الحاقی فایل مذکور حذف شود.
همچنین با آپلود فایل در اینترنت و الحاق به ایمیل و کپی در درایوهای غیر NTFS و... این stream ها منتقل نخواهد شد.
شما نباید اطلاعات حیاتی و مهمی در این stream ها نگهداری کنید.

موفق باشید.
11 روز پیش
zahmah

 
سلام
متاسفانه نتوانستم ازش استفاده کنم. در واقع dll اش را نتوانستم پیدا کنم.
طبق گفته حضرتعالی ما دو فایل خواهیم داشت. نمیشه در دل خود فایل به نحوی آدرس رو ذخیره کرد؟ من آدرس فایل مبدا رو توی سیستم مقصد نیاز دارم.
11 روز پیش
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: zahmah
... در واقع dll اش را نتوانستم پیدا کنم ...

روی نام package ها لینک شان را دادم!
https://www.nuget.org/packages/CodeFluentRuntimeClient
https://www.nuget.org/packages/Trinet.Core.IO.Ntfs

مگر تا حالا از بسته های nuget استفاده نکرده اید؟
چطور از EF استفاده میکنید؟

راه اول:
به اینترنت وصل میشوید و از منوی Tools>NuGet Package Manager>Package Manager Console اقدام کرده و در کنسول خط فرمانی که باز میشود فرمان نصب را تایپ میکنید:
Install-Package CodeFluentRuntimeClient -Version 1.0.0.844
یا
Install-Package Trinet.Core.IO.Ntfs -Version 4.1.1


راه دوم:
به اینترنت وصل میشوید و از منوی Tools>NuGet Package Manager>Manage NuGet Package for Solution اقدام کده و در فرمی که باز میشود به برگه Browse رفته و نام بسته Trinet.Core.IO.Ntfs یا CodeFluentRuntimeClient را جستجو کرده و روی دکمه Install کلیک میکنید.

نقل قول نوشته شده توسط: zahmah
... دو فایل خواهیم داشت ...

این با مفهوم فایل متفاوت است، چیزی جایی دیده نمیشود، نوعی دیتای اضافه و دلخواه برای فایل است.
هشت روز پیش
zahmah

 
سلام
اگه اشتباه نکنم نمونه کدهای بالا در مورد یک فایل doc هستش
امکانش هست همین کد رو در مورد یک فایل ویدیویی بنویسید که آدرسش رو توی فایل داده الحاقی ذخیره کنه؟
هشت روز پیش
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: zahmah
امکانش هست همین کد رو در مورد یک فایل ویدیویی بنویسید که ...

همانطورکه قبلا هم اشاره کردم، ADS مکانیزم داخلی سیستم فایل NTFS است.
این یعنی در لایه خیلی پایین تری از آن عمل میکند که اصلا فرمت و داده های فایل اصلی در آن معنی داشته باشد.
برای هر نام و پسوند فایلی میتوانید از ADS استفاده کنید. در سطح درایور و سیستم-فایل NTFS همه فایل ها txt, dox, xls, mp4, mp3, wav, pdf, exe, jpg و... و... هیچ فرق و اهمیتی ندارد، برای سیستم-فایل/FS همه اینها فقط یک مشت string(نام) + مشتی byte(داده) بی معنی هستند.

مثل آن است که بگویید فرمان File.Delete برای doc چیست وحالا File.Delete برای ویدیو فرمانش چیست(؟!)
سیستم-فایل/FS میتواند یک فایل را به شرطی که Open نباشد ( ومجوزهای لازم را داشته باشید ) Delete کند، در این کار هیچ فرقی بین txt, doc, mp4, exe و... برایش ندارد.( اصلا متوجه فرمت داخلی فایل نمیشود و برایش مهم نیست چه برنامه و چه شرکتی چه چیزی و به شکلی در آن ذخیره کرده )

ADS هیچ تاثیری در داده های اصلی فایل ندارد، این اطلاعات اضافه کاملا بطور جداگانه (وبه نوعی مخفی) توسط خود سیستم-فایل ذخیره و مدیریت میشود.

نقل قول نوشته شده توسط: zahmah
... که آدرسش رو توی فایل داده الحاقی ذخیره کنه؟

یعنی چه؟ مثلا در داده الحاقی فایل C:\file.mp4 بیایید و ذخیره کنید "C:\file.mp4" ؟!!