Diff
checker
텍스트
텍스트
이미지
문서
Excel
폴더
Legal
Enterprise
데스크톱
요금제
로그인
데스크톱 앱 다운로드
텍스트 비교
두 텍스트 파일의 차이점을 찾아보세요
도구
기록
표시
레이아웃
나란히 보기
합쳐 보기
실시간 편집
공백 변경 숨기기
변경 없는 행 숨기기
줄바꿈 비활성화
비교 단위
스마트
구문
없음
모양 변경
처리
제외
텍스트 변환
첫 변경으로
수정
Diffchecker Desktop
가장 안전하게 Diffchecker를 사용하는 방법. 데스크톱 앱을 사용하면 비교 데이터가 외부로 전송되지 않습니다!
데스크톱 앱 받기
file-v-xattr
생성일
6년 전
비교 결과 만료 없음
초기화
내보내기
공유
설명
21 삭제
행
총
삭제
글자
총
삭제
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
66 행
복사
16 추가
행
총
추가
글자
총
추가
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
62 행
복사
복사
복사됨
복사
복사됨
QueryData
genXattr
(QueryContext& context
) {
QueryData
genFileImpl
(QueryContext& context
, Logger& logger
) {
QueryData results;
QueryData results;
복사
복사됨
복사
복사됨
// Resolve file paths for EQUALS and LIKE operations.
// Resolve file paths for EQUALS and LIKE operations.
auto paths = context.constraints["path"].getAll(EQUALS);
auto paths = context.constraints["path"].getAll(EQUALS);
context.expandConstraints(
context.expandConstraints(
"path",
"path",
LIKE,
LIKE,
paths,
paths,
([&](const std::string& pattern, std::set<std::string>& out) {
([&](const std::string& pattern, std::set<std::string>& out) {
std::vector<std::string> patterns;
std::vector<std::string> patterns;
auto status =
auto status =
resolveFilePattern(pattern, patterns, GLOB_ALL | GLOB_NO_CANON);
resolveFilePattern(pattern, patterns, GLOB_ALL | GLOB_NO_CANON);
if (status.ok()) {
if (status.ok()) {
for (const auto& resolved : patterns) {
for (const auto& resolved : patterns) {
out.insert(resolved);
out.insert(resolved);
}
}
}
}
return status;
return status;
}));
}));
복사
복사됨
복사
복사됨
// Iterate through each of the resolved/supplied paths.
for (const auto& path_string : paths) {
for (const auto& path_string : paths) {
복사
복사됨
복사
복사됨
boost::filesystem
::path path = path_string;
fs
::path path = path_string;
boost::system::error_code ec;
genFileInfo(path, path.parent_path(), "",
results
);
// Folders can have extended attributes too
if (!(boost::filesystem::is_regular_file(path, ec) ||
boost::filesystem::is_directory(path, ec))) {
continue;
}
getFileData(
results
, path.string()
);
}
}
// Resolve directories for EQUALS and LIKE operations.
// Resolve directories for EQUALS and LIKE operations.
auto directories = context.constraints["directory"].getAll(EQUALS);
auto directories = context.constraints["directory"].getAll(EQUALS);
context.expandConstraints(
context.expandConstraints(
"directory",
"directory",
LIKE,
LIKE,
directories,
directories,
([&](const std::string& pattern, std::set<std::string>& out) {
([&](const std::string& pattern, std::set<std::string>& out) {
std::vector<std::string> patterns;
std::vector<std::string> patterns;
auto status =
auto status =
resolveFilePattern(pattern, patterns, GLOB_FOLDERS | GLOB_NO_CANON);
resolveFilePattern(pattern, patterns, GLOB_FOLDERS | GLOB_NO_CANON);
if (status.ok()) {
if (status.ok()) {
for (const auto& resolved : patterns) {
for (const auto& resolved : patterns) {
out.insert(resolved);
out.insert(resolved);
}
}
}
}
return status;
return status;
}));
}));
// Now loop through constraints using the directory column constraint.
// Now loop through constraints using the directory column constraint.
for (const auto& directory_string : directories) {
for (const auto& directory_string : directories) {
if (!isReadable(directory_string) || !isDirectory(directory_string)) {
if (!isReadable(directory_string) || !isDirectory(directory_string)) {
continue;
continue;
}
}
복사
복사됨
복사
복사됨
std::vector<std::string>
file
s;
try {
if (listFilesInDirectory
(directory_string
, files).ok()) {
// Iterate over the directory and generate info for each regular
file
.
for (
const auto& file : files
) {
fs::directory_iterator begin
(directory_string
), end;
getFileData(
results
, file
);
for (
; begin != end; ++begin
) {
genFileInfo(begin->path(), directory_string, "",
results
);
}
}
복사
복사됨
복사
복사됨
} catch (const fs::filesystem_error& /* e */) {
continue;
}
}
}
}
복사
복사됨
복사
복사됨
return results;
}
}
}
저장된 비교 결과
원본
파일 열기
QueryData genXattr(QueryContext& context) { QueryData results; // Resolve file paths for EQUALS and LIKE operations. auto paths = context.constraints["path"].getAll(EQUALS); context.expandConstraints( "path", LIKE, paths, ([&](const std::string& pattern, std::set<std::string>& out) { std::vector<std::string> patterns; auto status = resolveFilePattern(pattern, patterns, GLOB_ALL | GLOB_NO_CANON); if (status.ok()) { for (const auto& resolved : patterns) { out.insert(resolved); } } return status; })); for (const auto& path_string : paths) { boost::filesystem::path path = path_string; boost::system::error_code ec; // Folders can have extended attributes too if (!(boost::filesystem::is_regular_file(path, ec) || boost::filesystem::is_directory(path, ec))) { continue; } getFileData(results, path.string()); } // Resolve directories for EQUALS and LIKE operations. auto directories = context.constraints["directory"].getAll(EQUALS); context.expandConstraints( "directory", LIKE, directories, ([&](const std::string& pattern, std::set<std::string>& out) { std::vector<std::string> patterns; auto status = resolveFilePattern(pattern, patterns, GLOB_FOLDERS | GLOB_NO_CANON); if (status.ok()) { for (const auto& resolved : patterns) { out.insert(resolved); } } return status; })); // Now loop through constraints using the directory column constraint. for (const auto& directory_string : directories) { if (!isReadable(directory_string) || !isDirectory(directory_string)) { continue; } std::vector<std::string> files; if (listFilesInDirectory(directory_string, files).ok()) { for (const auto& file : files) { getFileData(results, file); } } } return results; } } }
수정본
파일 열기
QueryData genFileImpl(QueryContext& context, Logger& logger) { QueryData results; // Resolve file paths for EQUALS and LIKE operations. auto paths = context.constraints["path"].getAll(EQUALS); context.expandConstraints( "path", LIKE, paths, ([&](const std::string& pattern, std::set<std::string>& out) { std::vector<std::string> patterns; auto status = resolveFilePattern(pattern, patterns, GLOB_ALL | GLOB_NO_CANON); if (status.ok()) { for (const auto& resolved : patterns) { out.insert(resolved); } } return status; })); // Iterate through each of the resolved/supplied paths. for (const auto& path_string : paths) { fs::path path = path_string; genFileInfo(path, path.parent_path(), "", results); } // Resolve directories for EQUALS and LIKE operations. auto directories = context.constraints["directory"].getAll(EQUALS); context.expandConstraints( "directory", LIKE, directories, ([&](const std::string& pattern, std::set<std::string>& out) { std::vector<std::string> patterns; auto status = resolveFilePattern(pattern, patterns, GLOB_FOLDERS | GLOB_NO_CANON); if (status.ok()) { for (const auto& resolved : patterns) { out.insert(resolved); } } return status; })); // Now loop through constraints using the directory column constraint. for (const auto& directory_string : directories) { if (!isReadable(directory_string) || !isDirectory(directory_string)) { continue; } try { // Iterate over the directory and generate info for each regular file. fs::directory_iterator begin(directory_string), end; for (; begin != end; ++begin) { genFileInfo(begin->path(), directory_string, "", results); } } catch (const fs::filesystem_error& /* e */) { continue; } }
비교하기