我正在编写应用程序来读取DICOM文件,我必须使用其他库来执行此操作。我发现该库将打开文件,但在完成时它不会关闭文件。图书馆不是开源的。我知道在Linux中打开文件限制是1024,我可以更改数字。但我不想这样做。我想关闭库打开的文件。如果我知道它正在打开,如何在C中关闭文件。我正在使用从http://cbi.nyu.edu/software/dinifti.php获得的DICOM2NII库。 这是打开文件的代码,但它没有关闭
bool DICOMImage::OpenFile(const char *path)
{
bool retValue = true;
DCM_Objects handle_;
unsigned long options = DCM_ORDERLITTLEENDIAN | DCM_FORMATCONVERSION | DCM_VRMASK;
// Try opening as PART10, if it fails it's might be bcause it does not have
// a preable and the try it that way
if ( DCM_OpenFile(path, options | DCM_PART10FILE, &handle_) != DCM_NORMAL )
{
DCM_CloseObject(&handle_);
COND_PopCondition(TRUE);
if ( DCM_OpenFile(path, options, &handle_) != DCM_NORMAL )
{
retValue = false;
}
else
retValue=true;
}
return retValue;
}
答案 0 :(得分:2)
在DICOMImage
课程中,添加成员
DCM_OBJECT *handle_;
并在析构函数中关闭文件
DICOMImage::DICOMImage() : handle_(0) { ... }
DICOMImage::~DICOMImage() {
if (handle_ != 0)
DCM_CloseObject(&handle_);
}
并在handle_
中使用此成员DICOMImage::OpenFile()
,当然。
答案 1 :(得分:1)
您可以首先测试所有文件描述符,通过在从0到fcntl(fd, F_GETFD)
的每个fd上执行虚拟getdtablesize()
来查看哪些文件描述符正在使用中。当库函数返回时,将再有一个打开的fd,你可以用close()
关闭它。您也可以在之前未打开的所有内容上调用close(fd)
,其中一个将成功(您可以在搜索中停止此时间点)。
可能你可以对第一个未使用的fd进行初始探测,并且库最终将使用该fd,前提是它不会执行比打开一个文件更复杂的任何操作。如果它打开多个文件或使用dup()
,它可能会在其他地方结束。
拼写出来:
#include <iostream>
#include <vector>
#include <unistd.h>
#include <fcntl.h>
std::vector<bool> getOpenFileMap()
{
int limit = getdtablesize();
std::vector<bool> result(limit);
for (int fd = 0; fd < limit; ++fd)
result[fd] = fcntl(fd, F_GETFD) != -1;
return result;
}
void closeOpenedFiles(const std::vector<bool> &existing)
{
int limit = existing.size();
for (int fd = 0; fd < limit; ++fd)
if (!existing[fd])
close(fd);
}
int getLikelyFd()
{
int limit = getdtablesize();
for (int fd = 0; fd < limit; ++fd)
if (fcntl(fd, F_GETFD) != -1)
return fd;
}
int main()
{
std::vector<bool> existing = getOpenFileMap();
int fd = open("/dev/null", O_RDONLY);
closeOpenedFiles(existing);
bool closed = write(fd, "test", 4) == -1;
std::cout << "complex pass " << std::boolalpha << closed << std::endl;
int guess = getLikelyFd();
fd = open("/dev/null", O_RDONLY);
bool match = fd == guess;
std::cout << "simple pass " << std::boolalpha << match << std::endl;
}