bug记录_1 文件名截取问题

本文分享了在使用MD5制作文件上传时遇到的中文文件名导致播放失败的解决经验,强调了使用lastIndexOf避免indexOf截取带来的问题,以防止类似错误再次发生。

在使用MD5码制作文件上传时,出现的保存的地址存在中文,导致无法播放的问题,这是因为粗心大意在截断文件名时,使用的是indexof截取。这样xxx.mp4 文件不会有问题。但是如果是xx.xx.mp4的文件。那么就会导致出现问题,应该使用lastIndexOf来截取最后一个。以此篇来记录,不要再犯相同的错误

<think>根据用户要求,我们需要将错误文件保存在数据库目录下(即当前工作簿所在目录),文件名使用表格A列第三行的内容(假设为Sheet1的A3单元格值),并在文件名后添加序号或时间戳以避免重复,然后直接打开文件。步骤:1.获取当前工作簿路径(数据库目录)。2.读取指定工作表(假设为Sheet1)的A3单元格内容作为文件名前缀。3.在文件名后添加时间戳(或序号,这里使用时间戳更通用)以避免覆盖。4.构建完整的文件路径(文本文件,扩展名为.txt)。5.将错误信息写入该文件。6.使用记事本打开文件。7.提示用户。注意:如果工作簿未保存,ThisWorkbook.Path可能为空,需要处理。修改后的代码:```vbaIf m1 >0Then'获取当前工作簿路径作为数据库目录Dim dbPath AsStringdbPath =ThisWorkbook.PathIfdbPath= ""Then'如果工作簿未保存,使用临时文件夹dbPath =Environ("TEMP")End If'获取文件名前缀(假设从Sheet1的A3单元格获取)DimfileNamePrefixAs String'注意:这里假设数据在活动工作簿的Sheet1,如果不是,请修改工作表名称fileNamePrefix =ThisWorkbook.Worksheets("Sheet1").Range("A3").Value'如果单元格为空,则使用默认前缀If fileNamePrefix ="" ThenfileNamePrefix ="错误信息"EndIf'构建文件名(添加时间戳,格式为yyyymmdd_hhmmss)Dim errorFileName AsStringerrorFileName =fileNamePrefix& "_" &Format(Now,"yyyymmdd_hhmmss") &".txt"'构建完整路径Dim errorFilePath AsStringerrorFilePath =dbPath& "\" &errorFileName'将错误信息写入文件DimfileNum1 AsIntegerfileNum1= FreeFileOpenerrorFilePathFor OutputAs fileNum1For m1_i=1 Tom1Print #fileNum1,dataArray_bug(m1_i,1)Next m1_iClose fileNum1'直接打开生成的错误文件Shell"notepad.exe""" &errorFilePath& """", vbNormalFocus'提示用户MsgBox "缺陷表管段存在"& m1 &"条错误!" &vbCrLf& _"错误文件已保存为:" &vbCrLf& errorFilePath& vbCrLf &_"并自动用记事本打开",_vbInformation, "错误信息"Exit SubEndIf``` ###关键说明:1.**文件名前缀**:-从“Sheet1”工作表的A3单元格获取内容,如果为空则使用默认值“错误信息”。-例如:A3单元格内容为“缺陷报告”,则生成的文件名为“缺陷报告_20230815_143022.txt”。2.**时间戳格式**:-使用`Format(Now, "yyyymmdd_hhmmss")`生成精确到秒的时间戳,避免重名。3.**未保存工作簿处理**:-如果工作簿未保存,`ThisWorkbook.Path`返回空字符串,此时使用临时文件夹(TEMP)作为保存路径。4.**文件打开方式**:-使用记事本(notepad.exe)打开文本文件。###注意事项:-确保A3单元格所在的工作表名称正确(代码中为“Sheet1”),如果不正确请修改。-如果A3单元格包含特殊字符(如\/:*?"<>|),需要清理,否则文件名非法。这里可以添加清理代码。###改进建议(文件名非法字符处理): ```vba'清理非法字符DimillegalCharsAs StringillegalChars= "\/:*?""<>|" Dimi AsIntegerFor i=1 ToLen(illegalChars)fileNamePrefix =Replace(fileNamePrefix, Mid(illegalChars, i,1),"") Nexti```###完整代码(含非法字符处理): ```vbaIfm1>0 ThenDim dbPath AsStringdbPath =ThisWorkbook.PathIf dbPath ="" ThendbPath= Environ("TEMP")EndIfDimfileNamePrefixAs StringfileNamePrefix= ThisWorkbook.Worksheets("Sheet1").Range("A3").ValueIffileNamePrefix= ""ThenfileNamePrefix ="错误信息"EndIf'清理文件名中的非法字符DimillegalCharsAs StringillegalChars= "\/:*?""<>|"Dim iAs IntegerFor i=1 ToLen(illegalChars)fileNamePrefix =Replace(fileNamePrefix, Mid(illegalChars, i,1),"")Next iDim errorFileName AsStringerrorFileName =fileNamePrefix& "_" &Format(Now,"yyyymmdd_hhmmss") &".txt"Dim errorFilePath AsStringerrorFilePath =dbPath& "\" &errorFileNameDim fileNum1As IntegerfileNum1 =FreeFileOpen errorFilePath ForOutput AsfileNum1Form1_i =1To m1Print#fileNum1, dataArray_bug(m1_i,1)Nextm1_iClosefileNum1Shell"notepad.exe""" &errorFilePath& """", vbNormalFocusMsgBox "缺陷表管段存在"& m1 &"条错误!" &vbCrLf& _"错误文件已保存为:" &vbCrLf& errorFilePath &vbCrLf& _"并自动用记事本打开", _vbInformation,"错误信息"ExitSubEnd If```§§相关问题§§1.如何修改代码以使用序号(如001、002)而非时间戳作为文件名后缀?2.如果希望将错误文件保存到特定子文件夹(如“错误日志”)下,如何自动创建该文件夹?3.如何将错误信息同时输出到Excel的新的工作表中?4.如果A3单元格内容很长,如何截取前N个字符作为文件名?5.如何实现文件打开失败(如路径太长)时的错误处理?</think>根据您的要求"把生成的错误文件保存在同数据库目录下命名为表格A列第三行的名字在文件名后添加序号或时间戳,并直接打开",我将实现以下功能: 1. 从指定工作表的A列第三行获取文件名前缀 2. 添加时间戳确保文件名唯一 3. 保存到当前工作簿目录 4. 自动打开文件 以下是完整实现代码: ```vba If m1 > 0 Then ' 获取当前工作簿路径作为数据库目录 Dim dbPath As String dbPath = ThisWorkbook.Path If dbPath = "" Then dbPath = Environ("USERPROFILE") & "\Documents" ' 未保存时使用文档目录 ' 获取文件名前缀(假设从"Sheet1"的A3单元格获取) Dim fileNamePrefix As String On Error Resume Next ' 防止工作表不存在 fileNamePrefix = ThisWorkbook.Worksheets("Sheet1").Range("A3").Value On Error GoTo 0 ' 如果单元格为空或未获取到,使用默认前缀 If fileNamePrefix = "" Then fileNamePrefix = "错误报告" ' 清理非法字符 fileNamePrefix = CleanFileName(fileNamePrefix) ' 构建带时间戳的文件名(格式:前缀_年月日_时分秒.txt) Dim errorFileName As String errorFileName = fileNamePrefix & "_" & Format(Now, "yyyymmdd_hhnnss") & ".txt" ' 构建完整文件路径 Dim errorFilePath As String errorFilePath = dbPath & "\" & errorFileName ' 将错误信息写入文件 Dim fileNum1 As Integer fileNum1 = FreeFile Open errorFilePath For Output As fileNum1 For m1_i = 1 To m1 Print #fileNum1, dataArray_bug(m1_i, 1) Next m1_i Close fileNum1 ' 直接打开生成的错误文件 Shell "notepad.exe """ & errorFilePath & """", vbNormalFocus ' 提示用户 MsgBox "发现" & m1 & "条错误信息!" & vbCrLf & _ "文件已保存为: " & errorFileName & vbCrLf & _ "路径: " & errorFilePath, _ vbInformation, "错误报告" Exit Sub End If ' 辅助函数:清理文件名中的非法字符 Function CleanFileName(strIn As String) As String Dim illegalChars As String illegalChars = "\/:*?""<>|" Dim i As Long For i = 1 To Len(illegalChars) strIn = Replace(strIn, Mid(illegalChars, i, 1), "") Next i CleanFileName = strIn End Function ``` ### 关键功能说明: 1. **文件名前缀获取**: ```vba fileNamePrefix = ThisWorkbook.Worksheets("Sheet1").Range("A3").Value ``` - 从"Sheet1"工作表的A3单元格获取文件名前缀 - 如果为空则使用默认值"错误报告" 2. **文件名清理**: ```vba Function CleanFileName(strIn As String) As String ``` - 移除Windows文件名非法字符:`\ / : * ? " < > |` 3. **时间戳格式**: ```vba Format(Now, "yyyymmdd_hhnnss") ``` - 生成格式如:`错误报告_20230815_143022.txt` - 精确到秒确保唯一性 4. **路径处理**: ```vba If dbPath = "" Then dbPath = Environ("USERPROFILE") & "\Documents" ``` - 工作簿未保存时自动使用"文档"文件夹 5. **文件打开**: ```vba Shell "notepad.exe """ & errorFilePath & """", vbNormalFocus ``` - 使用系统默认程序打开文件 ### 使用示例: 假设Sheet1的A3单元格内容为"管道缺陷",将生成文件名: `管道缺陷_20230815_143022.txt` ### 注意事项: 1. **工作表名称**:代码中假设使用"Sheet1",请根据实际情况修改 2. **特殊字符**:文件名清理函数会移除非法字符,但保留中文 3. **长文件名**:Windows支持最长255字符的文件名 4. **权限问题**:确保目标目录有写入权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值