View Full Version : ایجاد فایل با نام جدید در صورت وجود فایل؟!
  
Heidari66
شنبه 17 تیر 1402, 12:39 عصر
سلام
داخل پوشه ای فایلی با نام "123a" وجود داره
میخام بررسی بشه اگه فایلی با این نام وجود داشت بجای b ، a بزاره، مثلا بشه : "123b" و همینطور الی آخر تا "z"
پرستو پارسایی
سه شنبه 20 تیر 1402, 13:01 عصر
میتوانید از یک حلقه for برای ایجاد اسم فایل جدید با استفاده از تابع System.IO.File.Exists استفاده کنید. این تابع برای بررسی وجود یک فایل در مسیر مشخص شده استفاده میشود. برای تغییر یک حرف در نام فایل، میتوانید از تابع String.Replace استفاده کنید. به عنوان مثال، کد زیر نمونهای از چگونگی انجام این کار است:
Dim fileName As String = "123a"
Dim fileExtension As String = ".txt"
Dim newFileName As String
For i As Integer = Asc("a") To Asc("z")
    newFileName = fileName.Replace("a", Chr(i)) + fileExtension
    If Not System.IO.File.Exists(newFileName) Then
        Exit For
    End If
Next
MsgBox("New file name: " & newFileName)
در این کد، ابتدا یک رشته با نام fileName و پسوند fileExtension ایجاد شده است. سپس با استفاده از یک حلقه for، حرف آخر نام فایل تغییر داده شده و نام فایل جدید ساخته میشود. در هر مرحله از حلقه، با استفاده از تابع System.IO.File.Exists بررسی میشود که فایل با نام جدید در مسیر مورد نظر وجود دارد یا خیر. در صورتی که فایل وجود نداشت، حلقه توقف میکند و نام فایل جدید در متغیر newFileName ذخیره میشود. در انتها، نام فایل جدید در msgbox گزارش میشود
Heidari66
شنبه 24 تیر 1402, 18:13 عصر
ممنون از شما
ROSTAM2
یک شنبه 15 مرداد 1402, 08:05 صبح
سلام.
نظرتون رو در مورد این روش تغییر نام بگید:
https://www.aparat.com/v/zxloy (https://www.aparat.com/v/zxloy)
mazoolagh
سه شنبه 17 مرداد 1402, 13:51 عصر
سلام.
نظرتون رو در مورد این روش تغییر نام بگید:
https://www.aparat.com/v/zxloy (https://www.aparat.com/v/zxloy)
سلام و روز خوش
حالا چرا آپارات؟
راستش مدت ویدئو 15 دقیقه بود و من فقط 1-2 از اول و همینقدر از آخرش رو فقط دیدم.
در هر صورت کد تمیز و حرفه ای بود (مثل همه کارهای شما)،
فقط کاش یک کپی هم از خود کد رو اینجا پیوست میکردین.
ROSTAM2
سه شنبه 17 مرداد 1402, 21:42 عصر
سلام و روز خوش
حالا چرا آپارات؟
راستش مدت ویدئو 15 دقیقه بود و من فقط 1-2 از اول و همینقدر از آخرش رو فقط دیدم.
در هر صورت کد تمیز و حرفه ای بود (مثل همه کارهای شما)،
فقط کاش یک کپی هم از خود کد رو اینجا پیوست میکردین.
با تشکر از نظر شما در مورد کد و اینکه من با RegEx زیاد آشنایی ندارم ممکنه کد من در متودهای Extension مشکل داشته باشه.
این پروژه یک ماجول داشت که Extension Methods در اون قرار داشت و من موقع ظبط ویذئو از اون غافل شدم:
Imports System.Runtime.CompilerServices
Module Members
    <Extension> Function FirstWord(str As String) As String
        Dim Expr$ = str
        Dim Length As Integer = 0
        If str.Contains(Space(1)) Then
            Length = InStr(str, Space(1)) - 1
            Return str.Substring(0, Length)
        End If
        Return Expr
    End Function
    <Extension> Function FirstWord(str As String, ParamArray Excludes As Char()) As String
        Dim Expr$ = str
        Dim Index% = str.Length + 1
        For Each Exclude As Char In Excludes
            If str.Contains(Exclude) Then
                Index = InStr(str, Exclude).LessThan(Index)
            End If
        Next
        Return str.Substring(0, Index - 1)
    End Function
    <Extension> Function LessThan(Expr As Integer, Value As Integer)
        If Expr >= Value Then
            Return Value
        End If
        Return Expr
    End Function
    Structure NameInfo
        Public Title As String, Number As Integer
        Sub New(Title$, Optional Number% = 0)
            Me.Title = Title
            Me.Number = Number
        End Sub
    End Structure
    <Extension> Function Info(str As String) As NameInfo
        Dim RegEx As New Text.RegularExpressions.Regex("\w*\(\d*\)")
        With RegEx.Match(str)
            If .Success Then
                Return New NameInfo(Trim(str.Substring(0, str.Length - .Value.Length)), Val(.Value.Substring(1, .Value.Length - 1)))
            End If
            Return New NameInfo(str, 0)
        End With
    End Function
End Module
این هم دستورات متود Startup از کنسول اپلیکیشن:
Sub Main()
        Dim Word As String = "", CommandLine As String = ""
        Dim FileNames$() = {"FileName", "FileName (2)", "FileName (3)", "FileName (4)"}
        Do Until Word.ToUpper = "EXIT"
            Console.Write("NewNameCreator> ")
            CommandLine = Console.ReadLine
            Word = CommandLine.FirstWord()
            Select Case Word.ToUpper
                Case "EXIT"
                    Exit Do
                Case "NEW"
                    Dim X% = 0
                    Dim NewName As String = ""
                    Dim FileName As String = FileNames(0)
                    Console.WriteLine(" Exist FileName: {0}", FileName)
                    NewName = FileName
                    Do While NewName.ToLower = FileName.ToLower
FirstLine:              X += 1
                        NewName = String.Format("{0} ({1})", StrConv(FileName.Info.Title, VbStrConv.ProperCase), X)
                        For i = 1 To FileNames.Count - 1
                            If NewName.ToLower = FileNames(i).ToLower Then GoTo FirstLine
                        Next
                    Loop
                    Console.WriteLine("     NewName is: {0}", NewName)
            End Select
        Loop
    End Sub
این هم سورس پروژه:
154848
mazoolagh
شنبه 21 مرداد 1402, 11:54 صبح
سلام دوباره
اگر بخواهیم فایل جدید رو با شماره گذاری مشخص کنیم (شبیه روش نامگذاری در ساخت new folder) از کد زیر هم میشه استفاده کرد:
Function Get_First_Available_Name(Path As String,
                                  FileName As String,
                                  Extention As String) As String
    Dim New_FileName As String = $"{Path}{FileName}.{Extention}"
    Dim FileNames As List(Of String) = IO.Directory.GetFiles(Path, $"{FileName}*.{Extention}").ToList
    If FileNames.Count > 0 Then
        Dim i As Integer = 0
        Do Until FileNames.IndexOf(New_FileName) = -1
            i += 1
            New_FileName = $"{Path}{FileName} ({i}).{Extention}"
        Loop
    End If
    Return New_FileName
End Function
با این تفاوت که در ساخت new folder شماره گذاری از 2 شروع میشه!
همین منطق رو میشه برای نامگذاری بر اساس کارآکتر هم به کار برد.
در واقع کد پست شماره 2 هم همینجور هست - فقط در کد زیر یک بار directory میگیریم و بعد از ساختن نام فایل اون رو در نتایج جستجو میکنیم،
ولی در کد خانم پارسایی هر بار که نام فایل جدید ساخته میشه، وجود اون چک میشه (یعنی سراغ دیسک میریم نه حافظه).
Function Get_First_Available_Name_AZ(Path As String,
                                     FileName As String,
                                     Extention As String) As String
    Dim New_FileName As String = $"{Path}{FileName}.{Extention}"
    Dim FileNames As List(Of String) = IO.Directory.GetFiles(Path, $"{FileName}*.{Extention}").ToList
    If FileNames.Count > 0 Then
        Dim i As Integer = AscW("a") - 1
        Do Until FileNames.IndexOf(New_FileName) = -1
            i += 1
            If i > AscW("z") Then
                Return "No Name Available"
            Else
                New_FileName = $"{Path}{FileName}{ChrW(i)}.{Extention}"
            End If
        Loop
    End If
    Return New_FileName
End Function
mazoolagh
شنبه 21 مرداد 1402, 13:23 عصر
حالا که پست مرتبط با تاپیک گذاشتم، دیگه فکر نکنم گفتگو درباره موارد جانبی اسپم شمرده بشه.
با اجازه جناب ROSTAM2 ، 
چند مورد در ارتباط با اکستنشن هایی که استفاده کردن به چشمم خورد که مطرح میکنم (جدا از کاربردشون در این مسئله):
1- تابع LessThan :
گویا این تابع باید مینیمم بین 2 مقدار رو برگردونه - که میشه اینجوری هم نوشت:
<Extension> Function LessThan(Expr As Integer, Value As Integer) As Integer
    Return Math.Min(Expr, Value)
End Function
با اینحساب شاید واقعا نیازی بهش نباشه.
2- تابع FirstWord :
که از اسمش مشخص هست باید اولین کلمه یک استرینگ رو برگردونه.
این تابع رو میتونیم به این صورت بنویسیم که اول همه whitespace ها رو به یک space ساده تبدیل و بعد اون رو split کنیم:
Public Const Space As Char = ChrW(32)
<Extension> Function FirstWord(str As String) As String
    str = Regex.Replace(str, "\s+", Space).Trim
    Return str.Split(Space).First
End Function
یا حتی بهتر این که همه کلمه ها رو به صورت یک لیست برگردونیم و اونجا دستمون بازتر هست:
Public Const Space As Char = ChrW(32)
<Extension> Function GetWords(str As String) As List(Of String)
    str = Regex.Replace(str, "\s+", Space).Trim
    Return str.Split(Space).ToList
End Function
3- گویا تابع FirstWord یک overload هم داره و اینجور که از ظاهرش برمیاد: 
یک لیست از کارآکترها مشخص میکنین و از اولین جایی که هر کدوم از این ها در استرینگ ظاهر بشه از استرینگ حذف میشه و سمت چپ اون برمیگرده.
یعنی در واقع با FirstWord ارتباطی نداره و فقط یک substring با شرط هست (شاید اشتباه میکنم):
<Extension> Function FirstWord(str As String, Excludes As Char()) As String
    Dim index As Integer = str.IndexOfAny(Excludes)
    If index = -1 Then
        Return str
    Else
        Return str.Substring(0, index)
    End If
End Function
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.