PDA

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