Coping files and folders

Joel joelcnz at gmail.com
Thu Jan 24 16:45:43 PST 2013


Brilliant! Thanks.

I think the silent one has errors. But I've used the first 
function in my program now. With mine, strait after doing the 
copying is was supposed then update a file, but didn't. Your one 
seems to work though.

On Thursday, 24 January 2013 at 08:58:06 UTC, monarch_dodra wrote:
> On Thursday, 24 January 2013 at 07:41:23 UTC, Jacob Carlborg 
> wrote:
>> On 2013-01-24 07:28, Joel wrote:
>>> How does one copy folders (with files in them) including sub 
>>> folders,
>>> and creating any needed folders?
>>>
>>> Like:
>>> land\house\cat.d
>>> land\house\rat.exe
>>> land\house\bedroom\ants.txt
>>>
>>> to
>>> root\island\house\cat.d
>>> root\island\house\rat.exe
>>> root\island\house\bedroom\ants.txt
>>>
>>> One work around is to use 'system' (under std.process).
>>
>> I don't think Phobos currently has any functions for this. 
>> Someone posted code in these newsgroups of a parallel 
>> implementation of copy and remove.
>
> Mustn't be very hard to manually write "copyDir".
>
> The problem with "copyDir" is its transactional behavior: What 
> should it do in case of a failure mid copy? Bail? Cleanup? 
> Continue?
>
> Anyways, I just threw this together. The first version bails on 
> first error.
> The second version keeps going as much as it can, and returns 
> true on success.
>
> The caller is then free to (or not to) call rmdirRecurse in 
> case of failure.
>
> //Throws exception on first error.
> void copyDir(string inDir, string outDir)
> {
>     if (!exists(outDir))
>         mkdir(outDir);
>     else
>         if (!isDir(outDir))
>             throw new FileException(format("Destination path %s 
> is not a folder.", outDir));
>
>     foreach (entry; dirEntries(inDir.idup, SpanMode.shallow))
>     {
>         auto fileName = baseName(entry.name);
>         auto destName = buildPath(outDir, fileName);
>         if (entry.isDir())
>             copyDir(entry.name, destName);
>         else
>             copy(entry.name, destName);
>     }
> }
>
> //Silently keeps going as much as it can, then returns true on 
> success,
> //or false if an error occured.
> bool copyDirSilent(string inDir, string outDir)
> {
>     if (!exists(outDir))
>     {
>         auto e = collectException(mkdir(outDir));
>         if (e !is null)
>             return false;
>     }
>     else
>         if (!isDir(outDir))
>             return false;
>
>     foreach (entry; dirEntries(inDir, SpanMode.shallow))
>     {
>         auto fileName = baseName(entry.name);
>         auto destName = buildPath(outDir, fileName);
>         if (entry.isDir())
>         {
>             bool b = copyDirSilent(entry.name, destName);
>             if (b == false)
>                 return false;
>         }
>         else
>         {
>             auto e = collectException(mkdir(outDir));
>             if (e !is null)
>                 return false;
>         }
>     }
>     return true;
> }



More information about the Digitalmars-d-learn mailing list