多线程环境中的文件处理问题

时间:2019-01-23 10:29:41

标签: java multithreading

在多线程环境中,我面临着一类麻烦。  尽管这段代码已经很老了,并且已经运行了很长时间了。

其中一个人抱怨说他们面临着类似的问题。甚至  尽管由一个线程创建的文件存在,但另一个线程说不  文件存在。

我提供了解决问题的示例方法。

/**
  * Creates a temporary directory. Will be deleted when the program closed if it
  * is empty!
  *
  * @return the temporary directory
  * @throws com.osm.exception.WMException if there is a problem
  */
public static File createTempDir() throws WMException {
    synchronized (pdm.semaphore) {
        try {
            final File parent = WMSession.getWMSession().getRootTempDir();
            if (!parent.exists()) {
                throw new IllegalStateException(parent + " does not exist"); //frozen
            }

            final File tmpDirectory = File.createTempFile("WMTempDir", "", parent); //frozen
            tmpDirectory.delete();
            tmpDirectory.mkdirs();
            logFileCreated(tmpDirectory);
            return tmpDirectory;
        } catch (final IOException ioe) {
            throw new WMException(ioe);
        }
    }
}

此代码从另一个方法代码中调用,如下所示。

void copy_from_db2_using_temp_dir(String phys_name, int storage_type, int store_date, int file_flag,
        String directory, String file_name) throws WMException {
        final File destDir = new File(directory);

        if (!destDir.exists()) {
            // no conflict possible since destination directory does not yet exist.
            pdm.copy_from_db2(phys_name, storage_type, store_date, file_flag, directory, file_name);

            return;
        }

        final File tmpDir = WMFile.createTempDir();
        final File tmpDestFile = new File(tmpDir, file_name);
        final File destFile = new File(directory, file_name);

        try {
            final boolean destFileExistsFlag = destFile.exists();

            if (destFileExistsFlag && (file_flag != DEL_OLD)) {
                final String msg = pdm.fix_mesg(pdm.catgets("data_mgr", 266, "*** ERROR: Cannot overwrite file '{1}'"),
                        destFile.getAbsolutePath());
                throw new WMException(msg);
            }

            pdm.copy_from_db2(phys_name, storage_type, store_date, file_flag, tmpDir.getAbsolutePath(), file_name);

            if (tmpDestFile.isFile() && destFile.isDirectory()) {
                final String msg = pdm.fix_mesg(pdm.catgets("data_mgr", 269, "*** ERROR: Could not remove file '{1}'"),
                        destFile.getAbsolutePath());
                throw new WMException(msg);
            }

            moveFiles(tmpDestFile, destFile, (file_flag == DEL_OLD));
        } finally {
            deleteTempDir(tmpDir);
        }
    }

另一个线程/进程总是得到条件 !parent.exists()是。这是不正确的,因为它必须获得父项 文件。

需要建议输入或任何有助于了解是否 调用在代码中有问题或有问题。

我在StackOverflow上得到了一些东西,但不确定是否相关 这里。 File.exists() issue in multi threaded env

1 个答案:

答案 0 :(得分:0)

由于您要创建的文件的parentFolder不存在,因此触发了createTempDir函数中的

if (!parent.exists()) {。这与多线程无关。

示例:

可以说我们正在尝试使用C:\myGame\logs方法创建文件夹createTempDir。您的代码将首先测试以查看C:\myGame是否存在。如果不存在,则您的代码将引发非法状态异常,并且不会继续执行。

换句话说:您要在其中创建logs目录的父目录不存在。这可能是由于多种原因造成的:

  • WMSession.getWMSession().getRootTempDir()的配置不正确:它指向错误的文件路径。

  • 也许您甚至不需要断言父目录存在。因为您在代码中调用mkdirs(),所以logs目录的所有必需祖先目录都会自动创建。

您可以考虑以下解决方案:

  • 正确配置WMSession,使其指向正确的文件夹,并假设您希望在执行代码之前先存在父目录。

  • 根本不关心父目录是否存在,因为mkdirs会为您处理。