【问题标题】:open and edit files from dataset blob field从数据集 blob 字段打开和编辑文件
【发布时间】:2019-06-12 12:12:40
【问题描述】:

我在 TIBDataset blob 字段中有文件。

我需要能够打开它们并保存对它们所做的所有编辑。

我曾尝试打开这样的文件:

String sFileName = "Test.txt";
((TBlobField*)(TDataset->FieldByName("FILE"))->SaveToFile(sFileName);
ShellExecute(0, L"open", sFileName.c_str(), L"", L"", SW_SHOWNORMAL);

但我无法可靠地删除制作的文件,或保存所有编辑。

有没有办法从 blob 字段打开文件,或从关闭(外部)文件中获取回调?

【问题讨论】:

  • 我个人添加了一个计时器,每隔几秒钟我检查一下文件是否已更改。
  • @MarcGuillot 查看SHChangeNotifyRegister()ReadDirectoryChangesW() 以监控文件的更改。
  • @Taavi 如果您改用ShellExecuteEx()(或者更好的是CreateProcess()),它可以返回一个HANDLE,您可以等待知道生成的进程何时退出。然后您可以根据需要重新加载和删除您创建的文件。

标签: c++ delphi c++builder


【解决方案1】:

我碰巧找到了解决我自己问题的方法(不是完美的)。

我在头文件中声明了TStringList *slOpendFiles,并将所有保存的文件名添加到其中。

((TBlobField*)(TDataset->FieldByName("FILE"))->SaveToFile(sFileName);
slOpendFiles->Add(sFileName);`

在析构函数中,我尝试保存和删除文件:

int iMaxFile = slOpendFiles->Count;
int iCurrFile = 0;
while (iCurrFile < iMaxFile){
    TDataset->Edit();
    ((TBlobField*)(TDataset->FieldByName("FILE")))->LoadFromFile(slOpendFiles->Strings[iCurrFile]);
    TDataset->Post();
    DeleteFile(slOpendFiles->Strings[iCurrFile]);
    iCurrFile++;
}

NP!如果某些文件已打开,则删除对这些文件不起作用。

【讨论】:

  • "如果打开了某些文件,则删除对它们不起作用" - 当然不是。您不能删除正在使用的文件,除非使用该文件的代码在打开文件时明确指定DELETE 共享权限。您可以尝试做的是先自己打开每个文件,指定READ/WRITE 共享权限和FILE_FLAG_DELETE_ON_CLOSE 标志,然后让文件保持打开状态,直到您使用完它们,或者至少直到其他人使用它们打开它们。一旦每个人都关闭了它们的句柄,这些文件将自动删除。
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多