【问题标题】:For each loop keeps stopping on second cycle VB对于每个循环在第二个循环 VB 上不断停止
【发布时间】:2020-06-26 17:31:51
【问题描述】:

我正在编写的软件正在计算机上安装的服务中运行。 我想读取一个文本文件,对其进行处理,并将其编码到不同的路径。

该软件正在做它应该做的事情,但它只处理 2 个文件并且它停止了。我相信这与 for each 循环有关。我在网上找到了一些信息,说它与分配给每个循环的每个循环的内存量有关。

感谢任何帮助。

我的代码是这样的。

For Each foundFile As String In My.Computer.FileSystem.GetFiles("C:\Commsin\", FileIO.SearchOption.SearchTopLevelOnly, "ORDER-*.TXT")
      
            Dim filenum As Integer
            filenum = FreeFile()
            FileOpen(filenum, foundFile, OpenMode.Input)
            While Not EOF(filenum)

                <do a bunch of stuff> 
  
            End While

                <more code>

            Dim arrayFileName() As String = GetFileName.Split("\")
            Dim FileName As String = arrayFileName(2)

            My.Computer.FileSystem.CopyFile(foundFile, "C:\Commsin\Done\" & FileName)
            
            If IO.File.Exists("C:\Commsin\Done\" & FileName) Then
                My.Computer.FileSystem.DeleteFile(foundFile, Microsoft.VisualBasic.FileIO.UIOption.AllDialogs, Microsoft.VisualBasic.FileIO.RecycleOption.SendToRecycleBin)
                
                NoOfOrders -= NoOfOrders
            End If

Next

【问题讨论】:

  • [vba] 标签已移除。 VBA 和 VB.NET 是完全不同的语言。除了语法上的表面相似之外,它们没有任何共同之处。
  • 你相信这是循环吗?您是否尝试过调试应用程序?如果至少有某种错误消息,则有助于找到解决方案。
  • 我收到此错误“索引超出了数组的范围。”在事件查看器中。然后因为它的服务每 5 分钟循环一次,所以我收到此消息,然后“该进程无法访问文件 'C:\Commsin\ORDER-1009.TXT',因为它正被另一个进程使用。”
  • 对于第二条消息,您应该始终将文件修改操作包装在 try-catch 中,因为它们可能会由于无法实时检测到的其他进程的访问而失败(或者即使它们可以,在检测和尝试执行操作之间仍有一个竞争窗口)。

标签: vb.net for-loop foreach


【解决方案1】:

基本错误:不要修改您正在迭代的集合,即避免这种模式(伪代码):

For Each thing In BunchOfThings:
   SomeOperation()
   BunchOfThings.Delete(thing)
Next thing

这里最好遵循这个模式(又是伪代码):

While Not BunchOfThings.IsEmpty()
   thing = BunchOfThings.nextThing()
   SomeOperation()
   BunchOfThings.Delete(thing)
End While

我将把它作为练习留给您,让您将代码从第一种方法转换为第二种方法。

【讨论】:

    【解决方案2】:

    您似乎正在尝试使用 Split() 从完整路径中提取文件名。

    为什么不直接使用:

    Dim fileName As String = IO.Path.GetFileName(foundFile)
    

    代替:

    Dim arrayFileName() As String = GetFileName.Split("\")
    Dim FileName As String = arrayFileName(2)
    

    【讨论】:

      【解决方案3】:

      谢谢大家的建议,我已成功实施建议的更改。原来问题不在于代码本身。

      在我使用的其中一个文件中,它有一个文本行,一旦拆分成一个数组,它就不是所需的长度,会给出错误“索引超出数组的范围。”

      这是文件上的错误,我还添加了一些检查以防止将来出现此错误。 谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-18
        • 2017-11-20
        • 2021-09-15
        • 2012-07-12
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多