PDA

View Full Version : سوال: مشکل Directory.GetFiles با اسامی فارسی



sepehr1014
سه شنبه 15 مرداد 1392, 12:01 عصر
سلام دوستان
من برای نمایش فایل های فولدر ها از System.IO.Directory.GetFiles و Directory.EnumerateFiles استفاده میکنم. مشکل اینجاست که اگر اسم فایلی فارسی باشه، هر جفتشون Exception میدن. همین موضوع برای GetFolders و EnumerateFolders هم صادقه. مگر .net از Unicode پشتیبانی نمیکنه؟ پس مشکل چیه؟ و برای حلش باید چیکار کنم؟

ممنون از همه دوستان

ایمان مدائنی
سه شنبه 15 مرداد 1392, 12:06 عصر
FileInfo[] files = Directory.GetFiles(@"C:\test\", "*.txt");
foreach (FileInfo file in files)
{
string fileTemp = file.FullName;
StreamWriter sw = new StreamWriter(fileTemp, true, System.Text.Encoding.UTF8);
sw.WriteLine("");
sw.Close();
}

sepehr1014
سه شنبه 15 مرداد 1392, 14:18 عصر
ممنون از جواب سریعتون. ولی من نمیخوام اسم فایل ها رو در فایلی ذخیره کنم. قسمتی از پروژه یک File Explorer میخواد. که کد قسمت لود فایل به این شکله:
foreach (string s in Directory.EnumerateFiles(path, fil)) //Apply filter (fil)
{
string name = s.Substring(s.LastIndexOf("\\") + 1);


//Get file's icon ....

}
حالا مشکل اینجاست که وقتی کد بالا به فایلی میرسه که اسم فارسی داره، اررور میده ...

sepehr1014
چهارشنبه 16 مرداد 1392, 11:38 صبح
دوستان کسی نمیتونه کمک کنه؟ عجله دارم.
تو فروم های خارجی هم گشتم ولی چیزی پیدا نکردم...

esafb52
چهارشنبه 16 مرداد 1392, 11:46 صبح
108673من اینو تست کردم مشکلی نداره

string[] files = Directory.GetFiles(@"C:\\", "*.*");
foreach (string file in files)
{
listBox1.Items.Add(file);
}

Sajjad.Aghapour
چهارشنبه 16 مرداد 1392, 11:52 صبح
لطف کنید خطای مربوطه رو اینجا قرار بدید.
در ضمن برای گرفتن نام فایل ها میتونید از کلاس Path استفاده کنید:

foreach (string s in Directory.EnumerateFiles(path, fil)) //Apply filter (fil)
{
string name =Path.GetFileName(s);
//Get file's icon ....
}


@esafb52 (http://barnamenevis.org/member.php?113083-esafb52):
وقتی از کاراکتر @ (مه به اون کاراکتر Verbatim گفته میشه) قبل از متغیرهای رشته ای استفاده می کنید نیازی Double Slash نیست.

string[] files = Directory.GetFiles(@"C:\", "*.*");

sepehr1014
چهارشنبه 16 مرداد 1392, 11:59 صبح
ممنون. صحیحه. مشکل از اون قسمت نبود. حالا که من آدرس فایل رو دارم، با کد زیر آیکونش رو بدست میارم. ولی این قسمت کد Exception میده اگه اسم فایل فارسی باشه:
public const uint SHGFI_ICON = 0x100;
public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
public const uint SHGFI_SMALLICON = 0x1; // 'Small icon

[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);

[DllImport("User32.dll")]
public static extern int DestroyIcon(IntPtr hIcon);

public static System.Drawing.Icon GetFileIcon(string fileName, bool large)
{
uint flags;
if (large)
flags = SHGFI_LARGEICON;
else
flags = SHGFI_SMALLICON;
SHFILEINFO shinfo = new SHFILEINFO();
IntPtr hImgSmall = Win32.SHGetFileInfo(fileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | flags);

System.Drawing.Icon icon = (System.Drawing.Icon)System.Drawing.Icon.FromHandl e(shinfo.hIcon).Clone();
Win32.DestroyIcon(shinfo.hIcon);
return icon;
}

این رو چیکار کنم؟

sepehr1014
چهارشنبه 16 مرداد 1392, 12:32 عصر
راه حل رو پیدا کردم. اگه تو DLLImport، CharSet رو تنظیم کنیم، مشکل حل میشه. مثلا در کد بالا:
[DllImport("shell32.dll", CharSet = CharSet.Unicode)]

ممنون از تمامی دوستان