Каталог — Как создать новую папку в% APPDATA% с помощью C ++?

Я попытался включить библиотеку IOUtils и использовать команду CSIDL, но она не работает …

Вот часть кода, которая делает это:

//------------------- Includes -----------------------
#include <fmx.h>
#include <IOUtils.hpp>
#pragma hdrstop

#include "Unit1.h"#include "Unit2.h"#include "Unit3.h"//---------------------- end  ------------------------
//---- On Form Show (bugged event: It doesn't create the needed folder) ----

void __fastcall TfrmInicio::FormShow(TObject *Sender)
{
if (TDirectory::Exists("CSIDL_APPDATA\\Nintersoft\\Ninterfin")) {
if (FileExists("CSIDL_APPDATA\\Nintersoft\\Ninterfin\\Inf.nf")) {
mmInfo->Lines->LoadFromFile("CSIDL_APPDATA\\Nintersoft\\Ninterfin\\Inf.nf");
}
}
else {
TDirectory::CreateDirectory("CSIDL_APPDATA\\Nintersoft\\Ninterfin");
}
}

//--------------------------------- end ------------------------------------

Я надеюсь, что вы можете помочь мне …
Большое спасибо XD

0

Решение

Вы не должны непосредственно кодировать «CSIDL_APPDATA» непосредственно в строку пути к каталогу. CSIDL_APPDATA это идентификационный номер (в частности, 26) для виртуальной папки, которую необходимо динамически разрешать во время выполнения с помощью Win32 API, например:

void __fastcall TfrmInicio::FormShow(TObject *Sender)
{
WCHAR szPath[MAX_PATH+1] = {0};
if (SUCCEEDED(SHGetFolderPathW(FmxHandleToHWND(Handle), CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath)))
{
String DirPath = TPath::Combine(szPath, L"Nintersoft\\Ninterfin");
TDirectory::CreateDirectory(DirPath);

String FileName = TPath::Combine(DirPath, L"Inf.nf");
if (TFile::Exists(FileName))
mmInfo->Lines->LoadFromFile(FileName);
}
}

В качестве альтернативы, только на Vista и более поздних, используйте SHGetKnownFolderPath() вместо:

void __fastcall TfrmInicio::FormShow(TObject *Sender)
{
PWSTR pszPath;
if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &pszPath)))
{
String DirPath = TPath::Combine(pszPath, L"Nintersoft\\Ninterfin");
CoTaskMemFree(pszPath);

TDirectory::CreateDirectory(DirPath);

String FileName = TPath::Combine(DirPath, L"Inf.nf");
if (TFile::Exists(FileName))
mmInfo->Lines->LoadFromFile(FileName);
}
}

В качестве альтернативы используйте Sysutils::GetEnvironmentVariable() чтобы получить значение %APPDATA% вместо использования CSIDL или же KNOWNFOLDERID:

void __fastcall TfrmInicio::FormShow(TObject *Sender)
{
String DirPath = TPath::Combine(Sysutils::GetEnvironmentVariable(L"APPDATA"), L"Nintersoft\\Ninterfin");
TDirectory::CreateDirectory(DirPath);

String FileName = TPath::Combine(DirPath, L"Inf.nf");
if (TFile::Exists(FileName))
mmInfo->Lines->LoadFromFile(FileName);
}
2

Другие решения

Я думаю, что это должно помочь вам (=.

Файл NewDirectory.cpp

//includes standard libraries
#include <iostream>

//includes windows libraries
#include <windows.h>

//includes header files

int NewDirectory(){

char *Directory = "C://Users/user/AppData/somefolder/";

//Checks if folder of file exist
int FilePath = PathFileExist(Directory);

//Makes new directory
int NewFolder = CreateDirectory(Directory, NULL);

if(!FilePath){
std::cout << "Error could not find folder, trying to create new Directory" << std::endl;

NewFolder;

if(!NewFolder){
std::cout << "Could not make new directory closing" << std::endl;

return 1;
} else {
std::cout << "New Directory" << Directory << "Created!" << std::endl;

return 0;
}
} else {
std::cout << "the Directory" << Directory << "already exist" << std::endl;

return 0;
}
}
-1