1

文章底部的结论

我是 C# 的新手,才刚刚开始使用 System.IO,但无法找到有关我的问题的信息,所以想在这里问这些人:

我有一个程序,它在运行时创建一个目录,然后将某个变量的最新值写入 .txt 文件,这样如果程序中断或计算机断电,重新启动程序将检索存储的.txt 文件中的编号。

我只是这样做了:

    string INSTATR = LastValue.ToString();
    System.IO.File.WriteAllText(@"C:\\DotTempFiles\\"+Instrument.Name+"ATR.txt", INSTATR);

我第一次运行这个程序时,创建了文件,我发现在每个循环中,文件中的数字都被覆盖为我想要的最后一个有效数字。

但是,一旦我进入 DotTempFiles 目录并使用 Shift+Del 删除了 .txt 文件,该文件在运行程序时从未像我想象的那样返回。如果我删除整个目录并运行程序,则会重新创建目录但仍然不是文件。

如果我使用不同的 Instrument.Name 运行程序,则该新文件会按预期创建,但我曾经手动删除的原始文件仍然没有显示,即使在计算机重新启动后也是如此。

我在网上找不到任何信息线索,所以有人有想法吗?谢谢!

编辑(更多信息): 人们问了几个问题,所以我添加了更多信息(谢谢)

没有报告错误。它编译得很好,并且在运行时,有一个输出窗口通常会提醒我出现错误,比如我引用了一个空对象,或者尝试从一个空文件中读取,等等。没有发生这样的错误。

有关该程序的更多背景信息。有一个名为 NinjaTrader 的股票交易程序,它有自己的基于 C# 的 API。他们不会支持我的问题,因为这超出了他们打算让人们使用的脚本开发的正常范围,这对我来说没问题。该程序本身是在 NinjaTrader 中运行的交易策略,它公开了对以下两个主要方法的默认程序员访问权限:

初始化()

protected override void OnBarUpdate() //这是程序的主要部分,每次股票图表上的一根柱发生变化时都会调用它。

在变量声明部分我有这个:

    System.IO.DirectoryInfo di = Directory.CreateDirectory(@"C:\\DotTempFiles");

在 OnStartUp() 我有这个:

    //Set up ReadMe file in the temp directory in case people wonder why it keeps appearing
    string README = "This DotTempFiles directory is created by the strategy every time it is run, and temporary text files with the name [instrumentsymbol]ATR.txt are written into it containing the last highest ATRStopValue for the strategy, which if it is stopped and restarted with an open position, it will read from that file to get back the best value instead of recalculating it with possibility of a lower unwanted value.";
    System.IO.File.WriteAllText(@"C:\\DotTempFiles\\README.txt", README);

每次调用 OnBarUpdate()(最多每秒几次)时,它首先计算一个名为 LastValue 的 double,它是一个与股票价格相关的数字,然后将其转换为字符串 INSTATR,然后将其写入.txt 文件。

    string INSTATR = LastValue.ToString();
    System.IO.File.WriteAllText(@"C:\\DotTempFiles\\"+Instrument.Name+"ATR.txt", INSTATR);

这是我与这个问题相关的每一段代码。正如我上面提到的,它是第一次创建该文件,但由于我在 Windows 资源管理器中删除了该文件,因此无法重新创建它。但是,删除目录并重新启动策略程序确实会重新创建该目录。

OnTermination() 不用于以任何方式关闭或删除文件(以防万一人们想问)——除了已经显示的代码之外,我没有使用任何其他代码与文件交互。谢谢!

编辑2(阅读评论后更新): 谢谢你们的评论和帮助。当我回到家时,我会尝试用一个只包含这些代码行的空程序重新创建它的最小版本,看看结果是什么,我会以任何一种方式发布更新。

编辑3:谢谢史蒂夫,这是一个非常好的主意,我应该从现在开始使用这些东西。

编辑 4(结论): 嗯,我发现我忽略了一些关于我自己的代码逻辑的简单内容。我将 File.WriteAllText 设置为在 Double 变量值增加时触发,而不是在每次调用 OnBarUpdate 方法时触发。因此,除非每隔几个小时左右一次,否则不会写入文件,现在我看到一切正常。我很抱歉让所有这些人阅读这篇文章,因为它是基于我自己的另一个问题。然而,我非常感谢大家的评论帮助我走到了这一步,感谢史蒂夫和马克拉卡塔的建议,我从中学到了一些新的好东西。

4

1 回答 1

0

我发现文件创建没有任何问题,事实上我的编码逻辑调用它的频率远低于我想象的(每隔几个小时一次 vs 每秒几次)

于 2013-04-19T02:45:16.183 回答