VB.net程序在被要求读取.txt时挂起

VB.net程序在被要求读取.txt时挂起,vb.net,streamreader,Vb.net,Streamreader,我试图读取一个用单独的程序成功编写的.txt文件,但程序一直处于停滞状态(也就是说根本没有输入/输出,就像它有一个无限循环之类)。我得到的信息是“A”,但没有其他信息 我在像这样的网站上看到过很多帖子,它们列出了各种各样的读取文件的创造性方法,但是我找到的每个指南都希望我更改Msgbox a和Msgbox D之间的代码。它们都不会更改结果,所以我开始认为问题实际上在于我如何指出文件的位置。有一个代码(与Dim objReader As New System.IO.textleader(FileL

我试图读取一个用单独的程序成功编写的.txt文件,但程序一直处于停滞状态(也就是说根本没有输入/输出,就像它有一个无限循环之类)。我得到的信息是“A”,但没有其他信息

我在像这样的网站上看到过很多帖子,它们列出了各种各样的读取文件的创造性方法,但是我找到的每个指南都希望我更改Msgbox a和Msgbox D之间的代码。它们都不会更改结果,所以我开始认为问题实际上在于我如何指出文件的位置。有一个代码(与Dim objReader As New System.IO.textleader(FileLoc)有关),但当我要求读取文件时,我得到了文件的地址。这就是为什么我怀疑我指向了错误的.txt。有一个问题

如果我做错了,我完全不知道该怎么做

我在最后附上了代码片段(每一行无关的数据都从中删除)

如果重要的话,实际程序的位置在“G01制图”文件夹中


看起来您正在根据使用正确的方法/对象。 您的代码在新的VB控制台应用程序(.net 4.5)中为我运行

与MSGBOXs不同的方法是使用或

  • 如果MSGBOX A显示但未显示B,则问题在于构造流读取器。
    • 您可能正在监视应用程序的输出,但调试器(visual studio)已在该行上停止应用程序,只有一个例外。例如找不到文件,没有权限,使用http uri
  • 如果MSGBOX C未显示,则问题可能是文件在读取时出现问题。
    • 权限
    • 它有一行文字吗
    • 文件夹是否“联机”
  • 如果MSGBOX D显示,但什么也没有发生,那么您对
    WholeMap
    • 查看将
      MsgBox(“C”)
      重新连接到
      Debug.WriteLine(“读取”+WholeMap)

    • 在调试器中运行此命令会显示什么?你能在记事本中打开Map_Cygnus.txt文件吗?在第一行设置一个断点并运行程序以查看发生了什么

      Private BaseDirectory As String = "C:\Users\Adam\Documents\Visual Studio 2013\Projects\G01-Cartography\Maps\"
      
      Private Sub GameMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
          Dim WholeMap = File.ReadAllText(Path.Combine(BaseDirectory, "Map_Cygnus.txt"))
          Debug.Print("Size Of Map: {0}", WholeMap.Length)
      End Sub
      

      我有一些建议。首先,严格使用
      选项,它将帮助您避免路上的头痛

      打开文件的代码是正确的。除了避免使用
      MsgBox()
      进行调试,而是设置断点或使用
      debug.WriteLine()
      ,还将子例程包装在
      Try…Catch
      异常中

      Private Sub GameMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
          LoadMap("Map_Cygnus.txt")
      End Sub
      
      Private Sub LoadMap(FileLoc As String)
          Try
              FileLoc = "C:\Users\Adam\Documents\Visual Studio 2013\Projects\G01-Cartography\Maps\" + FileLoc
              MsgBox("A")
              Using File As New StreamReader(FileLoc)
                  MsgBox("B")
                  Dim WholeMap = File.ReadLine()         'dimming a variable inside a block like this means the variable only has scope while inside the block
                  MsgBox("C")
              End Using
              MsgBox("D")
          Catch ex As Exception
              MsgBox(ex.ToString)
          End Try
      End Sub
      
      请注意,您通常只应捕获您期望的任何异常,但我通常在调试类似的东西时捕获所有异常

      我还想指出的是,您只是将文件中的一行读入变量
      WholeMap
      。只要点击
      End Using
      行,该变量就会失去作用域,从而丢失您刚刚从文件中读取的行。我假设你有这样的代码,因为它似乎给你阅读带来了麻烦,但我想我还是要指出它

      Public Class GameMain
          Private WholeMap As String = ""
      
          Private Sub GameMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
              LoadMap("Map_Cygnus.txt")
          End Sub
      
          Private Sub LoadMap(FileLoc As String)
              Try
                  FileLoc = "C:\Users\Adam\Documents\Visual Studio 2013\Projects\G01-Cartography\Maps\" + FileLoc
                  Using File As New StreamReader(FileLoc)
                      WholeMap = File.ReadLine()         'dimming the variable above will give all of your subs inside class Form1 access to the contents of it (note that I've removed the Dim command here)
                  End Using
              Catch ex As Exception
                  MsgBox(ex.ToString)
              End Try
          End Sub
      End Class
      

      使用MsgBox()调试代码是一种非常危险的方法。它会导致重新进入,例如,您显示的事件将在加载完成之前触发。您需要学习在调试器中使用断点。以及调试器的调用堆栈窗口,以找出代码挂起的原因。需要学习的基本技能,花点时间。好吧,在这种情况下,什么是“重入”,什么是“调用堆栈”,加载部分的全部目的不是加载东西吗?如果你能找到一些解释这一点的链接,我将非常感激。这是一件非常糟糕的事情。集中精力,首先学习如何使用调试器。@Rettro调试器挂在哪里?显示了什么msgboxes?@mikek3332002我得到了“A”,但其他的都没有。当我在写问题的时候,不小心把这些信息删掉了,重新添加到原来的帖子中。实际上我有一个严格的选项,它在代码中的位置要高得多,所以它没有出现在这个片段中。(显然,你必须按住回车键才能换行,回车就可以发布,你只能编辑5分钟。谁知道呢。)我现在正试图加入那种调试行的东西,但可能需要一点时间才能弄清楚。我相信你会知道,我不是靠做这些为生的。如果你能给我指一些关于那些东西的指南,我会很感激的。该文件应该只有一行,它是一个坐标流(“1,3.5,3.16,3”等),但我不知道当使用关闭时数据会丢失。老实说,我不知道using能做什么,它只是迄今为止我发现的最简单的ey方法。using命令只允许您打开一个资源(如文件),当执行结束时,使用它关闭文件并为您处理资源。并不是使用会丢失数据,而是在使用块中减少了WholeMap变量。我编辑了我的答案,向您展示了我的意思。另外,关于调试文件给您带来麻烦的原因,请在
      LoadMap()
      方法中设置断点,方法是右键单击,选择断点,然后插入断点,然后运行代码。当它到达设置断点的行时,使用F11(默认值)让代码逐行运行。我敢打赌,用try-catch包裹住它,它会告诉你是什么导致它挂起/崩溃。我不小心把那条线剪断了。。。“A”显示,但其他三个不显示。当前正在尝试找出调试器。我可以打开txt文件,里面确实有数据,一行数字和符号(这就是我放在那里的)它在调试器中显示的内容。。。不知道现在正努力学习如何使用它。txt确实包含正确的数据,当我用记事本打开时,我可以看到它。可能需要几天的时间,但当我找到调试器时,我会给你回复。同时,你可以在
      Public Class GameMain
          Private WholeMap As String = ""
      
          Private Sub GameMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
              LoadMap("Map_Cygnus.txt")
          End Sub
      
          Private Sub LoadMap(FileLoc As String)
              Try
                  FileLoc = "C:\Users\Adam\Documents\Visual Studio 2013\Projects\G01-Cartography\Maps\" + FileLoc
                  Using File As New StreamReader(FileLoc)
                      WholeMap = File.ReadLine()         'dimming the variable above will give all of your subs inside class Form1 access to the contents of it (note that I've removed the Dim command here)
                  End Using
              Catch ex As Exception
                  MsgBox(ex.ToString)
              End Try
          End Sub
      End Class