PDA

View Full Version : كپي كردن فايل با اسم فارسي



SReza1
چهارشنبه 19 آبان 1389, 13:22 عصر
برخي از كاركترها نظير اين "ﯼ" كه نوشتم در صورتيكه در اسم فايل وجود داشته باشد (يا اسم فولدري كه اين فايل در آن هست) با دستور CopyFile ، كپي نمي‌گردد. در اين خصوص كسي كمكي مي‌تونه بكنه ؟

Felony
چهارشنبه 19 آبان 1389, 16:06 عصر
تو چه ویندوزی ؟ کدوم نسخه از دلفی ؟

از دلفی 2009 یا 2010 که از یونیکد پشتیبانی میکنن استفاده کنید .

vcldeveloper
چهارشنبه 19 آبان 1389, 17:06 عصر
از چه نسخه ایی از دلفی استفاده می کنید؟

اگر از نسخه یونیکد API مربوطه که نام فایل ها را به صورت PWideChar دریافت میکنه، استفاده کنید، نباید مشکل خاصی با کارکترهای فارسی داشته باشید. البته CopyFile یک تابع API ویندوز نیست، و مربوط به خودِ دلفی هست، ولی در داخل خودش از تابع API ویندوز استفاده میکنه. فکر کنم اسم تابع API اش FileCopy بود.

SReza1
پنج شنبه 20 آبان 1389, 12:52 عصر
از چه نسخه ایی از دلفی استفاده می کنید؟

اگر از نسخه یونیکد API مربوطه که نام فایل ها را به صورت PWideChar دریافت میکنه، استفاده کنید، نباید مشکل خاصی با کارکترهای فارسی داشته باشید. البته CopyFile یک تابع API ویندوز نیست، و مربوط به خودِ دلفی هست، ولی در داخل خودش از تابع API ویندوز استفاده میکنه. فکر کنم اسم تابع API اش FileCopy بود.


نسخه دلفي 7 مي‌باشد. چون نرم‌افزار به صورت client-server است روي گونه‌هاي مختلف ويندوز بايستي پشتيباني شود. در ضمن با توجه به تعداد خطوط بالاي اين application امكان استفاده از نسخ بالاتر دلفي وجود ندارد.
من فكر مي كردم دستور copyfile يك api است. اگر بود كه مشكلي نداشت چون خود ويندوز اين مشكل را ندارد و فايل را راحت كپي مي‌كند. خوب از اين نسخه يونيكد چطور مي‌شه استفاده كرد؟ مثالي داريد؟

Felony
پنج شنبه 20 آبان 1389, 20:43 عصر
از چه نسخه ایی از دلفی استفاده می کنید؟

اگر از نسخه یونیکد API مربوطه که نام فایل ها را به صورت PWideChar دریافت میکنه، استفاده کنید، نباید مشکل خاصی با کارکترهای فارسی داشته باشید. البته CopyFile یک تابع API ویندوز نیست، و مربوط به خودِ دلفی هست، ولی در داخل خودش از تابع API ویندوز استفاده میکنه. فکر کنم اسم تابع API اش FileCopy بود.

حاج علی ، CopyFile جزء API ها هست : http://msdn.microsoft.com/en-us/library/aa363851(VS.85).aspx


نسخه دلفي 7 مي‌باشد. چون نرم‌افزار به صورت client-server است روي گونه‌هاي مختلف ويندوز بايستي پشتيباني شود. در ضمن با توجه به تعداد خطوط بالاي اين application امكان استفاده از نسخ بالاتر دلفي وجود ندارد.
من فكر مي كردم دستور copyfile يك api است. اگر بود كه مشكلي نداشت چون خود ويندوز اين مشكل را ندارد و فايل را راحت كپي مي‌كند. خوب از اين نسخه يونيكد چطور مي‌شه استفاده كرد؟ مثالي داريد؟

نسخه یونیکد تابع میشه CopyFileW ، همه چیز توضیح داده شد ، خودتون کد رو بنویسید .

SReza1
شنبه 22 آبان 1389, 09:32 صبح
اينم كدش ولي باز هم كار نمي‌كنه!! اگه تو اسم فايلتون اون نوع كاركترها باشه نميشه

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;

vcldeveloper
شنبه 22 آبان 1389, 23:11 عصر
اينم كدش ولي باز هم كار نمي‌كنه!! اگه تو اسم فايلتون اون نوع كاركترها باشه نميشهعلتش اینه که برای تبدیل ANSI به یونیکد، شما از CodePage پیش فرض سیستم استفاده می کنید (CP_ACP). در این حالت، کارکترهای فارسی در آدرس های بین 127 تا 255 از جدول کارکترهای ANSI نگاشت میشند. کارکتر ی شما، یک کارکتر عربی (با کد یونیکد 064A) هست. سیستم نمیتونه این کارکتر رو با CodePage فعلی به درستی نگاشت کنه، پس به جای اون، یک ? دریافت می کنید. فایلی هم با اون نام پیدا نمیشه.

من با استفاده از Delphi 2010 امتحان کردم، بدون مشکل فایل رو کپی کرد. در Delphi 7 هم با استفاده از TntOpenDialg و FileCopyW امتحان کردم، به درستی عمل کرد. اما دریافت نام فایل با استفاده از OpenDialog در Delphi 7، و سپس تبدیل ANSI String مربوطه به WideString، موجب بروز خطا، مبنی بر پیدا نشدن فایل، میشه.

SReza1
دوشنبه 24 آبان 1389, 10:39 صبح
ممنون حاج علي
با استفاده از tntDialog اين مشكل حل شد. ظاهرا راه ديگه‌اي وجود ندارد. شايد اگر در opendialog معمولي نوع TFileName بجاي string از wideString استفاده مي‌كردند اين dialog نيز درست كار مي‌كرد.

nilidelphi
یک شنبه 30 آبان 1389, 08:15 صبح
من یکم گیج شدم....!!!

من از دلفی 2009 استفاده می کنم حالا اگه از یک OpenDialog معمولی استفاده کنم آیا میشه از مسیر فایل های فارسی استفاده کرد یا باید بازهم از TntDialog استفاده کنم؟

Felony
یک شنبه 30 آبان 1389, 12:38 عصر
من یکم گیج شدم....!!!

من از دلفی 2009 استفاده می کنم حالا اگه از یک OpenDialog معمولی استفاده کنم آیا میشه از مسیر فایل های فارسی استفاده کرد یا باید بازهم از TntDialog استفاده کنم؟

دلفی 2009 یونیکد هست و نباید مشکلی داشته باشه .

SirMehdi
یک شنبه 17 اردیبهشت 1391, 17:14 عصر
سلام دوستان من همه کارهایی رو که بالا گفتید انجام دادم
با دلفی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;

Mask
یک شنبه 17 اردیبهشت 1391, 19:21 عصر
قسمت کپی فایل رو با دلفی 2009 به بالا در یه dll بساز و با دلفی 7 وصل شو به dll و عملیات کپی رو انجام بده.
فقط حواست باشه متغیرات رو باید ansistring بگیری.
موفق باشید.

SirMehdi
دوشنبه 18 اردیبهشت 1391, 01:05 صبح
اوکی ممنون می رم تست کنم

SirMehdi
سه شنبه 19 اردیبهشت 1391, 10:24 صبح
اوکی شدم با Tnt جواب گرفتم
با DLL نه!! نمی دونمم چرا فقط چیزی که فهمیدم اینه که کلا این PWideChar ها خیلی حساسند با کدی که زیر نوشتم قشنگ کار می کنه ولی
وقتی بخوای به عنوان پارامتر به یه تابع دیگه یا یه دی ال ال پاسش کنی دیگه کار نمی کنه!!! اصلا منطقی نیست!!



CopyFileW( PWideChar(ttdlg1.filename), 'D:\FileCopy\d.txt', False);


تشکر از همه دوستان..

علی روشن
سه شنبه 16 اردیبهشت 1399, 10:12 صبح
اوکی شدم با Tnt جواب گرفتم
با DLL نه!! نمی دونمم چرا فقط چیزی که فهمیدم اینه که کلا این PWideChar ها خیلی حساسند با کدی که زیر نوشتم قشنگ کار می کنه ولی
وقتی بخوای به عنوان پارامتر به یه تابع دیگه یا یه دی ال ال پاسش کنی دیگه کار نمی کنه!!! اصلا منطقی نیست!!



CopyFileW( PWideChar(ttdlg1.filename), 'D:\FileCopy\d.txt', False);


تشکر از همه دوستان..

مهندس سلام بنده این مشکل را در کپی کردن , یا تغییر نام دادن فایل های تصویری که در اسم فایل و یا پوشه آن[ ی] فارسی هست دارم فرمودید ار
TntOpenDialg بجای OpenDialg استفاده کنم لطفا آدرس دانلود این کامپوننت را برای می گذارید