Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 558
  • Last Modified:

Create a path if not exists

How can I manage to force create a full path in Delphi?

Sample: D:\Part1\Part2\Part3\Part4\

Function willl check if path exists. If not exists it have to create the path.
I think about a function that will check each folder whether it exists and if not it will create it until it reach the top folder.

I know how to do this in C++ but how to manage this in Delphi?
0
Ingo Foerster
Asked:
Ingo Foerster
1 Solution
 
Evan CutlerVolunteer Chief Information OfficerCommented:
two options:


ForceDirectories('D:\Part1\Part2\Part3\Part4\');


or

if not DirectoryExists('c:\test') then
begin
CreateDir('C:\test');
end;
1
 
Ingo FoersterOwner, CTOAuthor Commented:
ok, I understand. But because I will not work on the file system with the function, I will work on a own file tree I wanted to now how to read each folder out of the path in Delphi

In C++ I use:

DWORD ChkCreateDir(const std::wstring &path)
{
    std::wstring wildCard = path;
    wchar_t acDir[MAX_PATH];
    wchar_t* pc = NULL;
    DWORD dwAtt = -1;

	//Check if the path contains Backslash
	if ( wildCard[wildCard.size() - 1] == L'\\' )
	{
		wildCard = wildCard.substr( 0, wildCard.size( ) - 1 );
	}


    dwAtt = GetFileAttributes (wildCard.c_str());

	if(dwAtt != INVALID_FILE_ATTRIBUTES){
		if((dwAtt & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
			return (dwAtt);
	}

    //if(FILE_ATTRIBUTE_DIRECTORY == dwAtt)
		//return (dwAtt);
    //if(dwAtt & FILE_ATTRIBUTE_DIRECTORY)
		//return (dwAtt);

    wcscpy(acDir, wildCard.c_str());

    pc = wcsrchr(acDir, L'\\');

    if(pc)
		*pc = (wchar_t) 0;
    else
		return (0xffffffff);

    dwAtt = ChkCreateDir(acDir);

    if((dwAtt & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
    {
		if(!CreateDirectory(wildCard.c_str(), NULL))
		{
			//ErrorExit(L"ChkCreateDir",L""); 
			return GetLastError();
		}

		return (dwAtt);
    }

    return (0);
}

Open in new window


I think I have to write a own ForceDirectory function because it is not a common file tree.
0
 
Ferruccio AccalaiSenior developer, analyst and customer assistance Commented:
As Evan suggested Sysutils.ForceDirectories does exactly what you're asking for

This example comes from Embarcadero Docwiki
procedure TForm1.Button1Click(Sender: TObject);
var
  Dir: string;
begin
  Dir := 'C:\APPS\SALES\LOCAL';
  if SysUtils.ForceDirectories(Dir) then
    Label1.Caption := Dir + ' was created'
end;

Open in new window

0
Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

 
sarabandeCommented:
I will not work on the file system with the function, I will work on a own file tree I wanted to now how to read each folder out of the path in Delphi
does that mean you actually don't want to create the folders as askd in the op?

if you only want to parse the path, you may use TStrings DelimitedText

procedure Split(Delimiter: Char; Str: string; ListOfStrings: TStrings) ;
begin
   ListOfStrings.Clear;
   ListOfStrings.Delimiter       := Delimiter;
   ListOfStrings.StrictDelimiter := True; 
   ListOfStrings.DelimitedText   := Str;
end;

Open in new window


you will find this and other code samples if you search for Delphi and DelimitedText.

Sara
0
 
Geert GOracle dbaCommented:
you have an own tree structure for directory paths on a windows system which does not follow the windows filing system ?

and how does windows find your files then ?
0
 
Ingo FoersterOwner, CTOAuthor Commented:
Please understand that Windows is just a small piece of the world. There are some open file systems for disks as example, like UDF. For this UDF authoring I need to write a virtual file sytsme (tree) to place the files well and work with sorting feature and to follow some special specifications.
So this is not a Windows nor macOS or Linux, it is a virtual file system where windows special functions will not work.

However, I have found that the ForceDirectories code is open source and I was able to rewrite the code in the case I need. Just replaced with CreateDir and DirExists of my own file system objects and it work well.
0
 
Ingo FoersterOwner, CTOAuthor Commented:
ForceDirectories was right because I was able to find this in opensource and rewrite the function to my needs.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now