Commit 80652055 authored by Steven's avatar Steven Committed by Brad King

Directory: Use Windows Extended Paths

Teach `Load` to access the filesystem using extended paths to handle
long absolute paths.  Add a test case.
parent e1006189
......@@ -1032,6 +1032,7 @@ IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
testSystemTools
testCommandLineArguments
testCommandLineArguments1
testDirectory
)
IF(KWSYS_STL_HAS_WSTRING)
SET(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
......
......@@ -118,8 +118,8 @@ bool Directory::Load(const std::string& name)
struct _wfinddata_t data; // data of current file
// Now put them into the file array
srchHandle =
_wfindfirst_func((wchar_t*)Encoding::ToWide(buf).c_str(), &data);
srchHandle = _wfindfirst_func(
(wchar_t*)Encoding::ToWindowsExtendedPath(buf).c_str(), &data);
delete[] buf;
if (srchHandle == -1) {
......
......@@ -2269,11 +2269,7 @@ bool SystemTools::CopyADirectory(const std::string& source,
const std::string& destination, bool always)
{
Directory dir;
#ifdef _WIN32
dir.Load(Encoding::ToNarrow(Encoding::ToWindowsExtendedPath(source)));
#else
dir.Load(source);
#endif
size_t fileNum;
if (!SystemTools::MakeDirectory(destination)) {
return false;
......@@ -2626,11 +2622,7 @@ bool SystemTools::RemoveADirectory(const std::string& source)
}
Directory dir;
#ifdef _WIN32
dir.Load(Encoding::ToNarrow(Encoding::ToWindowsExtendedPath(source)));
#else
dir.Load(source);
#endif
size_t fileNum;
for (fileNum = 0; fileNum < dir.GetNumberOfFiles(); ++fileNum) {
if (strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)), ".") &&
......
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing#kwsys for details. */
#include "kwsysPrivate.h"
#include KWSYS_HEADER(Directory.hxx)
#include KWSYS_HEADER(Encoding.hxx)
#include KWSYS_HEADER(SystemTools.hxx)
// Work-around CMake dependency scanning limitation. This must
// duplicate the above list of headers.
#if 0
#include "Directory.hxx.in"
#include "Encoding.hxx.in"
#include "SystemTools.hxx.in"
#endif
#include <fstream>
#include <iostream>
#include <sstream>
#include <testSystemTools.h>
int _doLongPathTest()
{
using namespace kwsys;
static const int LONG_PATH_THRESHOLD = 512;
int res = 0;
std::string topdir(TEST_SYSTEMTOOLS_BINARY_DIR "/directory_testing/");
std::stringstream testpathstrm;
std::string testdirpath;
std::string extendedtestdirpath;
testpathstrm << topdir;
size_t pathlen = testpathstrm.str().length();
testpathstrm.seekp(0, std::ios_base::end);
while (pathlen < LONG_PATH_THRESHOLD) {
testpathstrm << "0123456789/";
pathlen = testpathstrm.str().length();
}
testdirpath = testpathstrm.str();
#ifdef _WIN32
extendedtestdirpath =
Encoding::ToNarrow(SystemTools::ConvertToWindowsExtendedPath(testdirpath));
#else
extendedtestdirpath = testdirpath;
#endif
if (SystemTools::MakeDirectory(extendedtestdirpath)) {
std::ofstream testfile1(
(extendedtestdirpath + "longfilepathtest1.txt").c_str());
std::ofstream testfile2(
(extendedtestdirpath + "longfilepathtest2.txt").c_str());
testfile1 << "foo";
testfile2 << "bar";
testfile1.close();
testfile2.close();
Directory testdir;
// Set res to failure if the directory doesn't load
res += !testdir.Load(testdirpath);
// Increment res failure if the directory appears empty
res += testdir.GetNumberOfFiles() == 0;
// Increment res failures if the path has changed from
// what was provided.
res += testdirpath != testdir.GetPath();
SystemTools::RemoveADirectory(topdir);
} else {
std::cerr << "Failed to create directory with long path: "
<< extendedtestdirpath << std::endl;
res += 1;
}
return res;
}
int testDirectory(int, char* [])
{
return _doLongPathTest();
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment