2017-02-02 6 views
1

임시 폴더에 파일을 쓰려고하는데 제대로 실행되지 않습니다. 나중에이 코드를 호출하여 올바른 위치를 참조하지만 존재하지 않는다고 말합니다. 내가 뭘 잘못하고 있는지에 대한 어떤 생각?임시 폴더에 쓰는 방법

 ofstream fout("%TEMP%\\test.bat"); 
     fout << "cd C:\\Users\\jrowler\\Documents" << endl; 
     //Some more fout commands to write to bat 
     fout.close(); 
     wchar_t cmdline[] = L"cmd.exe /C %TEMP%\\test.bat"; 

if (!CreateProcess(NULL, cmdline, NULL, NULL, false, CREATE_UNICODE_ENVIRONMENT, 
     (LPVOID)env.c_str(), NULL, &si, &pi)) 
    { 
     std::cout << GetLastError(); 
     abort(); 
    } 

TEMP 폴더를 사용하지 않으면 모든 것이 작동합니다. 바탕 화면에 넣고 싶다면 완벽하게 작동합니다. 생성시 환경 변수가 올바르게 작동하지 않는 이유는 있지만 프로세스를 만들려고 할 때 환경 변수에 지정된 올바른 위치를 참조하는 오류가 발생합니다.

+6

'fstream'은 Windows 환경 변수 확장을 전혀 알지 못합니다. 변수를 잡고 직접 해보고 싶을 것입니다. https://msdn.microsoft.com/en-us/library/windows/desktop/ms683188(v=vs.85).aspx –

+0

이 질문에 답변하기 위해 내가 제공 할 수있는 것이 있습니까? – Jeff

+0

아니, 정말 좋았어! 미안 지연 수용. –

답변

8

은퇴 한 닌자가 가리키는 것처럼 환경 변수를 사용하도록 선택한 경우 translate the environment variable 일 수 있습니다.

또한 특수 폴더에는 다른 방법이 있습니다. 실제로 임시 폴더에는 전용 기능이 있습니다 (GetTempPath()).

DWORD const bufferSize = ::GetTempPath(0u, nullptr) + 1u; // get the necessary buffer size 
ASSERT(bufferSize); 

wchar_t* buffer = new wchar_t[bufferSize]; 
std::memset(buffer, 0x00, bufferSize); 
VERIFY(::GetTempPath(bufferSize, &buffer[0u])); 
// [ perform various logic ] 
delete[] buffer; 

다른 특수 폴더의 경우 Shell API를 사용할 수 있습니다.

SHGetFolderPath()SHGetKnownFolderPath()은 대상 폴더가있는 모든 위치에서 다양한 버전의 Windows에서 잘 작동합니다. 그리고 tremendous number of folders이 있습니다.

wchar_t folder[MAX_PATH+1]; 
int const folderId = ... // <-- defined in Shlobj.h 

HRESULT const hr = ::SHGetFolderPath(nullptr, folderId, nullptr, SHGFP_TYPE_CURRENT, folder); 
if (S_OK != hr) 
{ 
    TRACE("ERROR: Unable to get folder path."); 
    return false; 
} 

// [ perform various logic ] 

wchar_t* folder = nullptr; 
KNOWNFOLDERID const folderId = ... // <-- defined in KnownFolder.h 
HRESULT const hr = ::SHGetKnownFolderPath(folderId, 0u, nullptr, &folder); 
if (S_OK != hr) 
{ 
    TRACE("ERROR: Unable to get folder path."); 
    return false; 
} 

// [ perform various logic ] 
::CoTaskMemFree(folder); 

EDIT

는 : creating and using a temp file 대한 구체적 예있다.

EDIT2 : TEMP/TMP environment variables may be slightly different on various systems에 유의하십시오. 그러나 그들은 같은 가치이어야합니다. GetTempPath()의 '설명'섹션을 보면 경로가 어떻게 결정되었는지 확인할 수 있습니다.

+1

오 WinAPI, 당신은 너무 추합니다. –

+0

@ 길버트 : 어떻게 개선하겠습니까? 부정 행위는 허용되지 않습니다. 개선 된 버전에는 C 인터페이스가 필요합니다. – IInspectable

+0

C++을 사용하고 있기 때문에 수동 메모리 관리 또는 수동 버퍼링을 사용하지 않아도됩니다. 그냥'std :: vector buffer (bufferSize);'를 사용하고 모든 것을 무료로 얻으십시오 (잠재적 인 예외 안전 포함). – IInspectable