مشكل با فارسي، زبان هاي وي بي و ....

A_123

Member
سلام
اين مشكل فك كنم يه ذره جامعه بين زبان هاي برنامه نويسي. خواهش ميكنم كمك كنيد . هر نظري مي تونه به من كمك كنه.

سوال اينه: چرا وقتي با استفاده از dirList ( كه فولدر هاي موجود در مسير داده شده به برنامه را ، نشان مي دهد) وارد فولدر هاي با نام هاي فارسي نمي شود؟
به عبارتي چرا زبان فارسي توسط آنها پشتيباني نمي شود؟
 

the_king

مدیرکل انجمن
سلام
اين مشكل فك كنم يه ذره جامعه بين زبان هاي برنامه نويسي. خواهش ميكنم كمك كنيد . هر نظري مي تونه به من كمك كنه.

سوال اينه: چرا وقتي با استفاده از dirList ( كه فولدر هاي موجود در مسير داده شده به برنامه را ، نشان مي دهد) وارد فولدر هاي با نام هاي فارسي نمي شود؟
به عبارتي چرا زبان فارسي توسط آنها پشتيباني نمي شود؟

چون dirList از سیستم کاراکتر های ASCII استفاده می کند که حروف فارسی در آن وجود ندارند و کاراکتر های معتبری نیستند.

این موضوع صرفا مربوط به زبان فارسی نیست، از اونجایی که خیلی از سیستم عامل ها و برنامه ها و زبان های
برنامه نویسی قدیمی از جدول کاراکتر های ASCII استفاده می کنند، صرفا رشته هایی را می پذیرند که
در جدول ASCII موجود باشد. هر کاراکتر ASCII صرفا یک بایت طول دارد که صرفا بر اساس حروف لاتین طراحی شده است.

ویژوال بیسیک 6 از نظر رشته ای از کاراکتر های Unicode استفاده می کند که هر کاراکتر دو بایت طول دارد و حروف
فارسی را بدون مشکل می پذیرد اما هم رابط نمایشی و هم رابط سیستم فایل ویژوال بیسیک ASCII است، یعنی
هم در نمایش حروف فارسی و هم در ارتباط با اسامی فارسی فایل ها و پوشه ها مشکل وجود دارد.

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

A_123

Member
ممنون از پاسختون

حالا نمیشه هیچ کاریش کرد؟ ببینید من یه فولدر با نام فارسی دارم که می خوام محتویات آن فولدر ( یا کل فولدر) را در مسیری مثلا Drive C کپی کنه. {چون فوادر داخل سی دی هستتش , امکان تغییر نام هم ندارم)
 

the_king

مدیرکل انجمن
ممنون از پاسختون

حالا نمیشه هیچ کاریش کرد؟ ببینید من یه فولدر با نام فارسی دارم که می خوام محتویات آن فولدر ( یا کل فولدر) را در مسیری مثلا Drive C کپی کنه. {چون فوادر داخل سی دی هستتش , امکان تغییر نام هم ندارم)

دو تا پیشنهاد می تونم بکنم، پیشنهاد اول که توصیه اش می کنم اینه که از ویژوال بیسیک 6 که قدیمی از رده خارجه
به ویژوال بیسیک Net. مهاجرت کنید که علاوه بر امکانات بیشتر و طراحی مدرن تر به دلیل اینکه ساختار اش کلا
بر اساس جدول Unicode است، هیچ مشکلی با کاراکتر های فارسی نخواهید داشت، چه در هنگام نمایش و
چه در سیستم فایل. تنها ایراد Net. نیازش به Framework اش است که نسبتا حجیمه.

پیشنهاد دوم ام اینه که از اسم فایل و پوشه های فارسی استفاده نکنید، شما می توانید از دستور های API ویندوز
برای کپی کردن فایل و پوشه های Unicode کمک بگیرید، اما این مساله مشکل DirList را حل نخواهد کرد،
DirList ذاتا ASCII است و با مسیر های Unicode کنار نمی آید.
 

A_123

Member
آیا فایل های exe زبان Dot Net به راحتی روی هر کامپیوتری اجرا میشه؟ منطورم اینه که اگه روی یه کامپوتری فریمور قدیمی بود(یعنی تاحالا روش دات.نت نصب نشده) آیا میشه از فایل های اجرایی exe بدون مشکل استفاده کرد؟ من خودمم برنامه هامو روی ویندوز 7 هم بدون مشکل خاصی اجرا کردم.

ممنون
 

the_king

مدیرکل انجمن
آیا فایل های exe زبان Dot Net به راحتی روی هر کامپیوتری اجرا میشه؟ منطورم اینه که اگه روی یه کامپوتری فریمور قدیمی بود(یعنی تاحالا روش دات.نت نصب نشده) آیا میشه از فایل های اجرایی exe بدون مشکل استفاده کرد؟ من خودمم برنامه هامو روی ویندوز 7 هم بدون مشکل خاصی اجرا کردم.

ممنون

اگه روی ویندوزی Framework با نسخه مناسب نصب نباشه، می بایستی ابتدا نصب بشه وگرنه برنامه Net. ای که
به اون نسخه Framework نیاز داره اجرا نمیشه. برای همینه که در کنار فایل Setup اکثر محصولاتی که با Net.
نوشته شده اند Setup مربوط به Framework رو هم قرار می دهند.

بستگی به نسخه Framework ای داره که باهاش برنامه رو کامپایل کرده اید و همچنین نسخه ویندوزی که
می خواهید رویش اجرا کنید. Visual Studio 2005 با Framework نسخه 2.0 عرضه شده که در ویندوز های
Vista و 7 نیازی به نصب Framework نداره چون روی خود ویندوز نسخه مناسب یا حتی بالاتر هست اما روی
ویندوز XP باید Framework نسخه 2.0 یا بالاتر نصب بشه، وگرنه برنامه هایی که با Visual Studio 2005
نوشتید روی ویندوز XP اجرا نمیشه.

Visual Studio 2008 علاوه بر Framework نسخه 2.0 با نسخه های 3.0 و 3.5 هم برنامه کامپایل می کنه،
اما ویندوز Vista بصورت پیشفرض نسخه 3.0 و ویندوز 7 نسخه 3.5 رو داره. پس ویندوز 7 هیچ مشکلی
با برنامه هایی که با Visual Studio 2008 می نویسید نداره، اما اگه می خواهید برنامه تون بدون نیاز
به نصب Framework روی ویندوز Vista اجرا بشه، برای کامپایل کردن برنامه از نسخه 2.0 یا 3.0 استفاده کنید.

Visual Studio 2010 که از نسخه های قبلی کاملتره با Framework نسخه های 2.0 و 3.0 و 3.5 و 4.0
برنامه کامپایل می کنه. طبیعتا اگه از نسخه 4.0 استفاده کنید روی همه ویندوز ها نیاز به نصب Framework 4.0
هست، حتی روی ویندوز 7

پس تا حد امکان از Framework 2.0 استفاده کنید تا لااقل روی ویندوز های Vista و 7 نیازی به نصب شدن
Framework نباشه، مگر اینکه از قابلیت هایی استفاده کنید که در Framework نسخه 2.0 نباشه.
 

A_123

Member
ادمین عزیز اگه برات زحمتی نیست , یه سورس برام بنویس همراه با فایل exe اش تو همون دات.نت با این ویژگی که :

بیاد هرچی فایل و فولدر در درایو F هست رو کپی کنه تو درایو E. به طوری از فولدرهای با نام فارسی هم پشتیبانی کنه و محتویات اونا رو هم کپی کنه. در اینجا درایو f , درایو سی.دی. رام هستش.
 

the_king

مدیرکل انجمن
ادمین عزیز اگه برات زحمتی نیست , یه سورس برام بنویس همراه با فایل exe اش تو همون دات.نت با این ویژگی که :

بیاد هرچی فایل و فولدر در درایو F هست رو کپی کنه تو درایو E. به طوری از فولدرهای با نام فارسی هم پشتیبانی کنه و محتویات اونا رو هم کپی کنه. در اینجا درایو f , درایو سی.دی. رام هستش.

من ادمین نیستم، ادمین ها مدیر کل اند.

اصل کار تابعی است که کار کپی کردن از یک مسیر به یک مسیر دیگه رو انجام میده (با همه زیر پوشه هاش) :
کد:
    Private Sub CopyFileFolders(ByVal source As String, ByVal dest As String, ByVal overwrite As Boolean)
        Dim files() As String, file As IO.FileInfo
        Dim dirs() As String, dir As IO.DirectoryInfo
        If IO.Directory.Exists(dest) = False Then
            Try
                IO.Directory.CreateDirectory(dest)
            Catch
                Exit Sub
            End Try
        End If
        Try
            files = IO.Directory.GetFiles(source, "*", IO.SearchOption.TopDirectoryOnly)
            For i As Long = files.GetLowerBound(0) To files.GetUpperBound(0)
                Try
                    file = New IO.FileInfo(files(i))
                    file.CopyTo(IO.Path.Combine(dest, file.Name), overwrite)
                Catch
                End Try
                Application.DoEvents()
            Next
        Catch
        End Try
        Try
            dirs = IO.Directory.GetDirectories(source, "*", IO.SearchOption.TopDirectoryOnly)
            For i As Long = dirs.GetLowerBound(0) To dirs.GetUpperBound(0)
                Try
                    dir = New IO.DirectoryInfo(dirs(i))
                    CopyFileFolders(dirs(i), IO.Path.Combine(dest, dir.Name), overwrite)
                Catch
                End Try
                Application.DoEvents()
            Next
        Catch
        End Try
    End Sub

پارامتر اول (source) مسیر مبدا است، مثلا \:F و پارامتر دوم (dest) مسیر مقصد، مثلا \:E
پارامتر سوم (overwrite) اگر False باشد فقط فایل هایی کپی می شوند که در مقصد وجود ندارند و روی فایل های
مشابهی که از قبل در مقصد وجود دارند چیزی نمی نویسد.
اما اگر True باشد همه فایل ها از مبداء به مقصد کپی می شوند، حتی اگر فایلی با همان نام در مقصد
وجود داشته باشد.

مثلا :
کد:
        CopyFileFolders("F:\", "E:\", True)

یک نمونه پروژه کامل با دو نسخه 2005 و 2008 ضمیمه این پست می باشد.
 

پیوست ها

  • CopyDrive.rar
    37.3 کیلوبایت · بازدیدها: 2

جدیدترین ارسال ها

بالا