如果一个文件夹包含未关闭的文件,则不删除该文件夹 - 页 7

 

明天我将尝试做一个能完全重现这个问题的脚本。

所以人们不会说我在这里做 "虚构")。

非常感谢大家愿意帮助和协助解决这个问题。))

 

有一个像这样的浮动错误(描述了序列,并附上了一个库.ex5文件)。记录这种事情是很困难的

关于交易、自动交易系统和策略测试的论坛

虫子,虫子,问题

A100, 2016.08.04 00:05

专家顾问打开文件时出错。比如说,如果。

1.删除 "一些不相关的代码"(见下文)

2. 或删除 ::Sleep(1000)

没有错误

//Test.mq5
#import "Test001.ex5"
        string f( string file );
#import
string __Period() { return StringSubstr( EnumToString((ENUM_TIMEFRAMES)Period()), 7 ); }
void OnInit()
{
        Print( Symbol(), ",", __Period(), ", результат=", f( "test.txt" ));
}

行动的顺序。

1.创建一个新的配置文件(如 "测试")。

2.打开两个新的图表,将Test.ex5专家顾问附在两个图表上(见图)。

4.选择任何其他现有的配置文件

5.选择 "测试 "配置文件

结果。

而Test001.mq5看起来像这样。

//Test001.mq5
#property library
//---
//здесь некий код не имеющий отношения к делу
//---
string f( string file ) export
{
        ::ResetLastError();
        int hFile = ::FileOpen( file, FILE_READ | FILE_SHARE_READ | FILE_TXT | FILE_ANSI | FILE_COMMON );
        if ( hFile == INVALID_HANDLE )
                return ::StringFormat( "Error(%d): Не был открыт файл: %s", ::GetLastError(), file );
        ::Sleep( 1000 );
        ::FileClose( hFile );
        return "OK";
}

现在用所附的库文件试了一下:结果是一样的(测试文件由两位专家分别打开,如果同时打开,其中一位专家报告错误)。
2017.08.28 23:40:43.623 测试(EURUSD,M15) EURUSD,M15, 结果=OK
2017.08.28 23:40:52.389 测试(GBPUSD,M15) GBPUSD,M15, 结果=OK

2017.08.28 23:41:14.387 测试(GBPUSD,M15) GBPUSD,M15, result=Error(5004): File was not opened: test.txt
2017.08.28 23:41:15.484 测试(EURUSD,M15) EURUSD,M15, result=OK


 

发现申请号#1530548,但没有评论--可能已经被纠正了。如果没有,请再次审查

 

Реter Konow:

该文件被 我的应用程序(文件导航器)打开,在另一个文件夹中被覆盖。

当文件被打开 阅读时,我们得到文件句柄

标签是Konow

覆盖后,我需要关闭文件,但我不能--(没有句柄),只能擦除文件。

要写到另一个文件,我需要另一个文件的句柄,所以把它存储在另一个变量中是有意义的。写入一个新文件后,两个文件的句柄被存储在两个变量中,两个文件都用这些句柄关闭。

标签 Konow:

没有句柄,因为该文件的创建时间和创建者都不清楚。

如果该文件是由无名氏和无名氏创建的,那么它很可能没有被任何应用程序使用。如果你出于某种目的打开了文件,那么你已经有了一个由 FileOpen 函数获得的句柄 ,你应该在擦除文件夹之前关闭它

科诺标签

也就是说,该文件存在于Files文件夹内,可以复制到另一个文件夹,之后再删除。

当把一个文件从一个可访问的程序复制到一个mql程序时,文件的句柄是绝对不必要的。

Reg Konow:

但你在复制后不能关闭该文件。没有手柄。

复制文件后,文件没有打开,不需要关闭它。

科诺标签

这可能就是为什么用已删除的文件进一步擦除FolderClean(),却没有效果。

这绝对是一个错误。

RetagKonow:

问题:我怎样才能在MQL程序中获得这个文件的句柄?

从上述情况来看,这个问题没有意义。文件句柄只在打开一个文件时获得,以确定文件 指针的位置FileTell 和FileSeek 从哪里读取或写入,强制将数据转储到磁盘FileFlush,当然还有关闭文件以释放它,让其他应用程序对其进行操作。


很意外地,我发现了你的问题所在。

在实验期间,在资源管理器或其他文件管理器中打开一个文件夹,以监测文件的创建和删除。而一旦文件被删除,文件夹就会保持繁忙,无法删除。其结果是

2017.08.29 09:42:15.657 Demo_FolderDelete (CADJPY,H4)   Не удалось удалить папку nonempty. Код ошибки=5024

但是,在尝试删除一个文件夹未果后,这个文件夹仍然很忙,唉,这是一个事实。现在,这将是向SD申请的主题。

ps;唉,我在实验过程中也搞砸了。写入文件后,将数据重置到磁盘,试图用记事本打开,但得到的答复是......(图)取消了打开的尝试,忘记了,这就是保留文件夹,不让它被删除。

摘要:在mql文件方面没有问题。

 

Alexey Viktorov:

完全是意外,我已经发现了你的问题所在。

在实验期间,在资源管理器或其他文件管理器中打开一个文件夹,以监测文件的创建和删除。而在删除文件后,该文件夹仍然被占用,无法删除。其结果是

2017.08.29 09:42:15.657 Demo_FolderDelete (CADJPY,H4)   Не удалось удалить папку nonempty. Код ошибки=5024

但是,在尝试删除一个文件夹未果后,这个文件夹仍然很忙,唉,这是一个事实。 现在将向员工代表报告这一情况。

我在完全不同的情况下遇到过这种行为--也是保持一个文件夹的删除状态,导致程序/脚本/SVN等无法删除该文件夹。

而且它总是以同样的方式处理--通过手动拆解该文件夹。所以这几乎不是一个终端或编辑器的问题。

 
Rashid Umarov:

我在完全不同的情况下遇到过这种行为--也是保持一个文件夹的开放性以备删除,结果是程序/脚本/SVN等无法删除该文件夹。

而且它总是以同样的方式处理--通过手动拆解给定的文件夹。所以这几乎不是一个终端或编辑器的问题。

我稍后补充了一下我的帖子。

关于交易、自动交易系统和测试交易策略的论坛

如果一个文件夹里有未关闭的文件,则不删除该文件夹

Alexey Viktorov, 2017.08.29 08:55


ps;唉,我在实验过程中也搞砸了。写入文件后,将数据重置到磁盘,试图用记事本打开它,但得到的答复是......(图)取消打开尝试,我忘了,这就是保留文件夹,不允许删除它。

摘要:在mql文件方面没有问题


奇怪的是,你引用了我的帖子,却没有这个补遗。

 
Alexey Viktorov:

我稍后补充了我的帖子。


奇怪的是,你在引用我的帖子时没有加上这一点。

只是为了让你对SD的答复有所准备。

 
Rashid Umarov:

只是让你对SD的反应有所准备。

因此,如果我理解了问题的原因,为什么要从SD中写出垃圾?我只是没有大声说,我拒绝写......我想这对每个人来说都是显而易见的。
 
Rashid Umarov:

我在完全不同的情况下遇到过这种行为--也是保持一个文件夹的开放性以备删除,导致程序/脚本/SVN等无法删除该文件夹。

而解决方法总是一样的--手动拆解该文件夹。所以这几乎不是一个终端或编辑器的问题。

文件管理器 打开一个文件夹 ,而不是一个文件,并不影响mql对其进行删除。

 
Alexey Viktorov:

1.在打开 一个文件进行阅读 ,获得文件句柄

2.要写到另一个文件,我们需要另一个文件句柄,所以把它存储在另一个变量中是合理的。写入新文件后,两个文件的句柄被存储在两个变量中,两个文件根据这些句柄被关闭。

3.如果该文件是由不知名的人在什么时候创建的,有一个非常好的机会,该文件没有被任何应用程序占用。如果你是为了某种目的而打开文件,你已经有一个 FileOpen 句柄 ,应该在清除文件夹之前关闭它

4.当把一个文件从一个可用的程序复制到mql时,文件柄是绝对不必要的。

5.一旦一个文件被复制,该文件就不会被打开,没有必要关闭它。


1 该句柄只需要用于FileClose函数。我没有打开该文件。它是在我之前创造的。我只复制它并擦掉它。我无法关闭它,因为没有手柄。

2.要复制(FileCopy),要移动(FileMove),不需要文件句柄。请参考文件。

3.如果我用FileOpen函数打开一个由别人创建的文件,我不会得到它的句柄。完全不知道我会得到哪个手柄。这可能是他的,也可能是相当不同的。我试图得到别人的文件的句柄,这样我就可以在复制操作后关闭FileClose它。这并不奏效。

4.复印时,不需要手柄。它的复制没有任何问题。但该文件会自动打开进行复制。此外,我不能用FileClose关闭它,因为没有句柄。这可能就是为什么FolderClean在删除复制的文件后不工作的原因。

5.你怎么知道复制后的文件没有打开?它没有被FileOpen函数明确打开,但它被复制了,这意味着它被打开了。因此,它在复制后,甚至在擦除后仍保持开放。可能是这样。