Filename concatenation eats folder parts

On 23/08/2016 at 13:26, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   R17 
Platform:   Windows  ;   
Language(s) :     C++  ;

---------
Hi everyone,

I was integrating GenerateTexturePath to my assets and have noticed one confusing thing with filename concatenation when I wanted to concanate a project directory path and filename relative path (including subfolders) and the filename itself.

	Filename doc_dir = doc>GetDocumentPath();
	Filename suggested_dir = texFilename.GetDirectory();
	Filename src_file = texFilename.GetFile();
	Filename dst_name;
  
	Filename dir2 = doc_dir + suggested_dir;
  
	printf("\n doc_dir: %s",		doc_dir.GetString().GetCStringCopy());
	printf("\n src_file: %s",		src_file.GetString().GetCStringCopy());
	printf("\n suggested_dir: %s",	suggested_dir.GetString().GetCStringCopy());  
	printf("\n dir2: %s",			dir2.GetString().GetCStringCopy());

It prints for given filename ./folder1/folder2/12.jpg typed to FILENAME field

doc_dir F:\Development	est scenes
src_file 12.jpg
suggested dir: ./folder1/folder2
dir2: F:\Development	est scenes\folder2

But why dir2 is F:\Development est scenes\folder2???

It should be dir2: F:\Development est scenes\folder1\folder2 instead

On 25/08/2016 at 01:43, xxxxxxxx wrote:

Hello,

it appears that the "+" or "+=" operator of the Filename class only adds the last part of the given Filename which is typically the actual name of the file. As far as I can see you would have to deconstruct the second Filename and add every part manually. This is some rough implementation you can use as a starting point to build your own solution. Don't forget to test this on all supported platforms:

  
Filename       fullPath  = Filename("F:\\Development\\test scenes");  
const Filename extraPath = Filename("./folder1/folder2");  
  
const String extraPathString = extraPath.GetString();  
  
Int32 start = 0;  
Int32 found = 0;  
  
// loop through filename parts  
while (extraPathString.FindFirst("/", &found, start))  
{  
  String subStr = extraPathString.SubStr(start, found - start);  
  if (subStr != ".")  
  fullPath += subStr;  
  
  start = found + 1;  
}  
  
// add rest  
const Int32  length = extraPathString.GetLength();  
const String subStr = extraPathString.SubStr(start, length - start);  
fullPath += subStr;  
  
GePrint("result: " + fullPath.GetString());  

best wishes,
Sebastian