برخي از كاركترها نظير اين "ﯼ" كه نوشتم در صورتيكه در اسم فايل وجود داشته باشد (يا اسم فولدري كه اين فايل در آن هست) با دستور CopyFile ، كپي نميگردد. در اين خصوص كسي كمكي ميتونه بكنه ؟
برخي از كاركترها نظير اين "ﯼ" كه نوشتم در صورتيكه در اسم فايل وجود داشته باشد (يا اسم فولدري كه اين فايل در آن هست) با دستور CopyFile ، كپي نميگردد. در اين خصوص كسي كمكي ميتونه بكنه ؟
تو چه ویندوزی ؟ کدوم نسخه از دلفی ؟
از دلفی 2009 یا 2010 که از یونیکد پشتیبانی میکنن استفاده کنید .
از چه نسخه ایی از دلفی استفاده می کنید؟
اگر از نسخه یونیکد API مربوطه که نام فایل ها را به صورت PWideChar دریافت میکنه، استفاده کنید، نباید مشکل خاصی با کارکترهای فارسی داشته باشید. البته CopyFile یک تابع API ویندوز نیست، و مربوط به خودِ دلفی هست، ولی در داخل خودش از تابع API ویندوز استفاده میکنه. فکر کنم اسم تابع API اش FileCopy بود.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
نسخه دلفي 7 ميباشد. چون نرمافزار به صورت client-server است روي گونههاي مختلف ويندوز بايستي پشتيباني شود. در ضمن با توجه به تعداد خطوط بالاي اين application امكان استفاده از نسخ بالاتر دلفي وجود ندارد.
من فكر مي كردم دستور copyfile يك api است. اگر بود كه مشكلي نداشت چون خود ويندوز اين مشكل را ندارد و فايل را راحت كپي ميكند. خوب از اين نسخه يونيكد چطور ميشه استفاده كرد؟ مثالي داريد؟
حاج علی ، CopyFile جزء API ها هست : http://msdn.microsoft.com/en-us/libr...51(VS.85).aspx
نسخه یونیکد تابع میشه CopyFileW ، همه چیز توضیح داده شد ، خودتون کد رو بنویسید .
آخرین ویرایش به وسیله Felony : پنج شنبه 20 آبان 1389 در 20:53 عصر
اينم كدش ولي باز هم كار نميكنه!! اگه تو اسم فايلتون اون نوع كاركترها باشه نميشه
procedure TForm1.Button1Click(Sender: TObject);
var
iNewSize : integer;
begin
if OpenDialog1.Execute then
CopyFileW(StringToPWide(OpenDialog1.FileName, iNewSize), StringToPWide('C:\1000.txt', iNewSize), False);
end;
function TForm1.StringToPWide( sStr: string; var iNewSize: integer ): PWideChar;
var
pw : PWideChar;
iSize : integer;
begin
{String to PWideChar, NB memory allocated must be freed by caller}
iSize := Length( sStr ) + 1;
iNewSize := iSize * 2;
{Allocate memory}
pw := AllocMem(iNewSize);
{Do conversion}
MultiByteToWideChar(CP_ACP, 0, PChar(sStr), iSize, pw, iNewSize );
Result := pw;
end;
آخرین ویرایش به وسیله SReza1 : شنبه 22 آبان 1389 در 10:05 صبح
علتش اینه که برای تبدیل ANSI به یونیکد، شما از CodePage پیش فرض سیستم استفاده می کنید (CP_ACP). در این حالت، کارکترهای فارسی در آدرس های بین 127 تا 255 از جدول کارکترهای ANSI نگاشت میشند. کارکتر ی شما، یک کارکتر عربی (با کد یونیکد 064A) هست. سیستم نمیتونه این کارکتر رو با CodePage فعلی به درستی نگاشت کنه، پس به جای اون، یک ? دریافت می کنید. فایلی هم با اون نام پیدا نمیشه.اينم كدش ولي باز هم كار نميكنه!! اگه تو اسم فايلتون اون نوع كاركترها باشه نميشه
من با استفاده از Delphi 2010 امتحان کردم، بدون مشکل فایل رو کپی کرد. در Delphi 7 هم با استفاده از TntOpenDialg و FileCopyW امتحان کردم، به درستی عمل کرد. اما دریافت نام فایل با استفاده از OpenDialog در Delphi 7، و سپس تبدیل ANSI String مربوطه به WideString، موجب بروز خطا، مبنی بر پیدا نشدن فایل، میشه.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
ممنون حاج علي
با استفاده از tntDialog اين مشكل حل شد. ظاهرا راه ديگهاي وجود ندارد. شايد اگر در opendialog معمولي نوع TFileName بجاي string از wideString استفاده ميكردند اين dialog نيز درست كار ميكرد.
من یکم گیج شدم....!!!
من از دلفی 2009 استفاده می کنم حالا اگه از یک OpenDialog معمولی استفاده کنم آیا میشه از مسیر فایل های فارسی استفاده کرد یا باید بازهم از TntDialog استفاده کنم؟
سلام دوستان من همه کارهایی رو که بالا گفتید انجام دادم
با دلفی7 و کامپوننت TnyOpenDialog هم مسیر رو می گیرم ولی باز هم اگر اسم فولدر یا فایلم فارسی باشه عمل کپی انجام نمی شه!!! ولی اگر فارسی نداشته باشه درست عمل می کنه من امکان استفاده از ورژن بالاتر دلفی رو ندارم آیا راه حل دیگه ای هست یا آبرو حیثیتمونو از دست میدیم جلو مشتری؟
کدی که استفاده کردم :
procedure TForm1.btn1Click(Sender: TObject);
var
iNewSize : integer;
begin
if tndlgOpenDialog.Execute then
CopyFileW( StringToPWide(tndlgOpenDialog.FileName, iNewSize),
StringToPWide('D:\FileCopy\t.txt', iNewSize), False);
end;
function TForm1.StringToPWide( sStr: string; var iNewSize: integer ): PWideChar;
var
pw : PWideChar;
iSize : integer;
begin
{String to PWideChar, NB memory allocated must be freed by caller}
iSize := Length( sStr ) + 1;
iNewSize := iSize * 2;
{Allocate memory}
pw := AllocMem(iNewSize);
{Do conversion}
MultiByteToWideChar(CP_ACP, 0, PChar(sStr), iSize, pw, iNewSize );
Result := pw;
end;
قسمت کپی فایل رو با دلفی 2009 به بالا در یه dll بساز و با دلفی 7 وصل شو به dll و عملیات کپی رو انجام بده.
فقط حواست باشه متغیرات رو باید ansistring بگیری.
موفق باشید.
اوکی ممنون می رم تست کنم
اوکی شدم با Tnt جواب گرفتم
با DLL نه!! نمی دونمم چرا فقط چیزی که فهمیدم اینه که کلا این PWideChar ها خیلی حساسند با کدی که زیر نوشتم قشنگ کار می کنه ولی
وقتی بخوای به عنوان پارامتر به یه تابع دیگه یا یه دی ال ال پاسش کنی دیگه کار نمی کنه!!! اصلا منطقی نیست!!
CopyFileW( PWideChar(ttdlg1.filename), 'D:\FileCopy\d.txt', False);
تشکر از همه دوستان..