【问题标题】:Creates output in debug, but not in release - Visual Studio 2012在调试中创建输出,但不在发布中创建输出 - Visual Studio 2012
【发布时间】:2014-01-09 18:03:25
【问题描述】:

我有一个 VB Visual Studio 2012 项目,我在其中创建 .csv 文件。下面是它的摘录。基本上,当我调试我的程序时,它会按预期在 bin/debug 中创建 .csv 文件。但是我无法弄清楚当我发布程序时它在哪里或为什么没有创建它们。我已将构建输出路径更改为几个不同的时间,并确保我在它的“发布”部分。我什至不在乎输出在哪里,我只是想要它在某个地方!谢谢

编辑:好的,所以我找到了文件... C:\Users\ah0169569\AppData\Local\Apps\2.0\BLWZBB1R.02J\XTOQVPX5.N3O\payr..tion_d‌​310a0976fa1c317_0001.0000_81024c9c62a3db84 所以这是一个愚蠢的位置。如何将输出更改为在我的应用程序文件夹中?还是用户指定的地方?

Sub DataTable2CSV(ByVal table As DataTable, ByVal filename As String)
    DataTable2CSV(table, filename, ",")
End Sub
Sub DataTable2CSV(ByVal table As DataTable, ByVal filename As String, _
    ByVal sepChar As String)
    Dim writer As System.IO.StreamWriter
    Try
        writer = New System.IO.StreamWriter(filename)

        ' first write a line with the columns name
        Dim sep As String = ""
        Dim builder As New System.Text.StringBuilder
        For Each col As DataColumn In table.Columns
            builder.Append(sep).Append(col.ColumnName)
            sep = sepChar
        Next
        writer.WriteLine(builder.ToString())

        ' then write all the rows
        For Each row As DataRow In table.Rows
            sep = ""
            builder = New System.Text.StringBuilder

            For Each col As DataColumn In table.Columns
                builder.Append(sep).Append(row(col.ColumnName))
                sep = sepChar
            Next
            writer.WriteLine(builder.ToString())
        Next
    Finally
        If Not writer Is Nothing Then writer.Close()
    End Try
End Sub

【问题讨论】:

  • 如果您从“程序文件”之类的东西运行已发布的应用程序,则您的应用程序可能无权在那里创建/读取/更改/删除文件。将输出目标更改为用户文件夹
  • 你从哪里调用子程序? filename 传递的内容是什么?
  • 以这种方式编写 try/catch 是一个有保证的系统,永远不会知道您的代码为什么不起作用。
  • 它被安装到用户文件夹中,所以我认为不是这样。我将文件名作为字符串传递给文件。
  • 我清除了所有的 try/catch 语句,结果还是一样

标签: vb.net visual-studio-2012 csv output


【解决方案1】:

在您的代码中更改的第一件事是 Try/Finally。这样,您将永远不会知道您的代码是否失败以及失败的原因。我添加了一个 Catch 和一个 MessageBox 只是为了显示是否有错误

Try
    Using writer = New System.IO.StreamWriter(filename)

        Dim builder As New System.Text.StringBuilder
        For Each col As DataColumn In table.Columns
            builder.Append(col.ColumnName + sepChar)
        Next
        builder.Length -= 1
        builder.AppendLine()

        For Each row As DataRow In table.Rows
            For Each col As DataColumn In table.Columns
                builder.Append(row(col.ColumnName) + sepChar)
            Next
            builder.Length -= 1
            builder.AppendLine()
        Next
        writer.Write(builder.ToString())
    End Using
 Catch ex As Exception
    MessageBox.Show(ex.Message)
 End Try

接下来是Using Statement,它确保在出现异常时也能正确关闭您的流。 最新是对您使用 StringBuilder 来累积文本并在一次调用中编写所有内容的修复。当然这对于小数据来说不是问题。

【讨论】:

  • 我刚刚完全删除了我的 try catch 语句,但仍然没有收到任何错误。
  • 我现在也在使用你的代码,它返回成功,但仍然没有输出。 (我确实将第 13 行中的 + 更改为 &)
  • 我不知道你这边发生了什么。老实说,原始代码也应该可以工作,我只能想象一个权限问题,但应该显示一个消息框。尝试放置一些显示当前值的消息框以检查代码是否按预期运行
猜你喜欢
  • 2012-11-10
  • 2012-09-01
  • 2013-01-21
  • 2015-07-24
  • 1970-01-01
  • 2017-03-16
  • 2014-06-27
  • 1970-01-01
相关资源
最近更新 更多