Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

Create a path if not exists

Posted on 2016-11-03
7
Medium Priority
?
402 Views
Last Modified: 2016-11-04
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
Comment
Question by:Ingo Foerster
7 Comments
 
LVL 9

Expert Comment

by:Evan Cutler
ID: 41872837
two options:


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


or

if not DirectoryExists('c:\test') then
begin
CreateDir('C:\test');
end;
1
 

Author Comment

by:Ingo Foerster
ID: 41872920
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
 
LVL 23

Accepted Solution

by:
Ferruccio Accalai earned 2000 total points
ID: 41873246
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
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 35

Expert Comment

by:sarabande
ID: 41873597
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
 
LVL 38

Expert Comment

by:Geert Gruwez
ID: 41873602
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
 

Author Comment

by:Ingo Foerster
ID: 41873703
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
 

Author Closing Comment

by:Ingo Foerster
ID: 41873723
ForceDirectories was right because I was able to find this in opensource and rewrite the function to my needs.
0

Featured Post

Become an Android App Developer

Ready to kick start your career in 2018? Learn how to build an Android app in January’s Course of the Month and open the door to new opportunities.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
Article by: evilrix
Looking for a way to avoid searching through large data sets for data that doesn't exist? A Bloom Filter might be what you need. This data structure is a probabilistic filter that allows you to avoid unnecessary searches when you know the data defin…
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.
Suggested Courses

564 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question