Thread overview
RePost: Help to convert a code to D
Aug 26, 2013
Alexandre
Aug 26, 2013
bearophile
Aug 26, 2013
Andre Artus
Aug 26, 2013
Era Scarecrow
Aug 26, 2013
Andre Artus
Aug 26, 2013
Andre Artus
Aug 26, 2013
Andre Artus
August 26, 2013
Hi :)

I'm starting with D language... and, I try to convert a C# code
to D...
So, my C# code, I get file informations, and, I create folders
with all days of month of specific year...

So, that is my C# code...

using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;

namespace Organizador
{
     class Organiza
     {
         private string[] MesesDoAno =
         {
           "Janeiro", "Fevereiro",
           "Marco", "Abril",
           "Maio", "Junho",
           "Julho", "Agosto",
           "Setembro", "Outubro",
           "Novembro", "Dezembro"
         };

         private string DirReceb = string.Empty;

         public Organiza()
         {
             CriaDiretorios();
             MoveArquivos();
         }

         private void CriaDiretorios()
         {
             DirReceb = "RECEBIDOS\\" +
DateTime.Now.Year.ToString() + "\\";
             // Cria o diretorio "root"
             if (!Directory.Exists(DirReceb))
                 Directory.CreateDirectory(DirReceb);

             // cria os diretorios dos meses do ano
             for (int i = 0; i < 12; i++)
                 if (!Directory.Exists(DirReceb + MesesDoAno))
                     Directory.CreateDirectory(DirReceb +
MesesDoAno[i]);

             // cria os diretorios com os dias dos meses e ano
             for (int i = 1; i <= 12; i++)
             {
                 string dia;
                 string mes;
                 var ano = DateTime.Now.Year;
                 var DiasDoMes =
DateTime.DaysInMonth(DateTime.Now.Year, i);

                 if (i < 10)
                     mes = "0" + i.ToString();
                 else
                     mes = i.ToString();

                 for (int j = 1; j <= DiasDoMes; j++)
                 {
                     if (j < 10)
                         dia = "0" + j.ToString();
                     else
                         dia = j.ToString();

                     string StrDia = string.Format("{0}-{1}-{2}",
dia, mes, ano);
                     string StrData = DirReceb + MesesDoAno[i-1] +
"\\" + StrDia;

                     if (!Directory.Exists(StrData))
                         Directory.CreateDirectory(StrData);
                 }
             }
         }

         private void MoveArquivos()
         {
             string[] filters = new[] { "*.REM", "*.RET" };

             for (int i = 0; i < 2; i++)
             {
                 DirectoryInfo di = new
DirectoryInfo(Directory.GetCurrentDirectory());
                 var files = di.GetFiles(filters[i]);

                 foreach (var fi in files)
                 {
                     var mes = fi.CreationTime.Month;
                     var strdt =
fi.CreationTime.ToString("dd-MM-yyyy");

                     string DestDir = DirReceb + MesesDoAno[mes -
1] + "\\" + strdt + "\\" + fi.Name;

                     File.Move(fi.Name, DestDir);
                 }
             }
         }
     }

     class Program
     {
         static void Main(string[] args)
         {
             try
             {
                 new Organiza();
             }
             catch (Exception ex)
             {
                 Console.WriteLine(ex.Message);
             }
         }
     }
}


So, to create directory and move files... I get the documentation
on that page: http://dlang.org/phobos/std_file.html

But, I don't know, How I can get the file information and what is
the best way to create the directory's, so, I need some help :)

I appreciate the help :)
August 26, 2013
Alexandre:

> So, that is my C# code...

If you don't receive answers, then I suggest you to cut your program in perpendicular slices, and try to translate them in D, one after the other, and to show them here, hoping for comments. In a technical forum people are usually happier when you do some work yourself.

Bye,
bearophile
August 26, 2013
On Monday, 26 August 2013 at 13:30:38 UTC, Alexandre wrote:
> Hi :)
>
> I'm starting with D language... and, I try to convert a C# code
> to D...
> So, my C# code, I get file informations, and, I create folders
> with all days of month of specific year...
>
> So, that is my C# code...
>
> using System;
> using System.IO;
> using System.Linq;
> using System.Collections.Generic;
>
> namespace Organizador
> {
>      class Organiza
>      {
>          private string[] MesesDoAno =
>          {
>            "Janeiro", "Fevereiro",
>            "Marco", "Abril",
>            "Maio", "Junho",
>            "Julho", "Agosto",
>            "Setembro", "Outubro",
>            "Novembro", "Dezembro"
>          };
>
>          private string DirReceb = string.Empty;
>
>          public Organiza()
>          {
>              CriaDiretorios();
>              MoveArquivos();
>          }
>
>          private void CriaDiretorios()
>          {
>              DirReceb = "RECEBIDOS\\" +
> DateTime.Now.Year.ToString() + "\\";
>              // Cria o diretorio "root"
>              if (!Directory.Exists(DirReceb))
>                  Directory.CreateDirectory(DirReceb);
>
>              // cria os diretorios dos meses do ano
>              for (int i = 0; i < 12; i++)
>                  if (!Directory.Exists(DirReceb + MesesDoAno))
>                      Directory.CreateDirectory(DirReceb +
> MesesDoAno[i]);
>
>              // cria os diretorios com os dias dos meses e ano
>              for (int i = 1; i <= 12; i++)
>              {
>                  string dia;
>                  string mes;
>                  var ano = DateTime.Now.Year;
>                  var DiasDoMes =
> DateTime.DaysInMonth(DateTime.Now.Year, i);
>
>                  if (i < 10)
>                      mes = "0" + i.ToString();
>                  else
>                      mes = i.ToString();
>
>                  for (int j = 1; j <= DiasDoMes; j++)
>                  {
>                      if (j < 10)
>                          dia = "0" + j.ToString();
>                      else
>                          dia = j.ToString();
>
>                      string StrDia = string.Format("{0}-{1}-{2}",
> dia, mes, ano);
>                      string StrData = DirReceb + MesesDoAno[i-1] +
> "\\" + StrDia;
>
>                      if (!Directory.Exists(StrData))
>                          Directory.CreateDirectory(StrData);
>                  }
>              }
>          }
>
>          private void MoveArquivos()
>          {
>              string[] filters = new[] { "*.REM", "*.RET" };
>
>              for (int i = 0; i < 2; i++)
>              {
>                  DirectoryInfo di = new
> DirectoryInfo(Directory.GetCurrentDirectory());
>                  var files = di.GetFiles(filters[i]);
>
>                  foreach (var fi in files)
>                  {
>                      var mes = fi.CreationTime.Month;
>                      var strdt =
> fi.CreationTime.ToString("dd-MM-yyyy");
>
>                      string DestDir = DirReceb + MesesDoAno[mes -
> 1] + "\\" + strdt + "\\" + fi.Name;
>
>                      File.Move(fi.Name, DestDir);
>                  }
>              }
>          }
>      }
>
>      class Program
>      {
>          static void Main(string[] args)
>          {
>              try
>              {
>                  new Organiza();
>              }
>              catch (Exception ex)
>              {
>                  Console.WriteLine(ex.Message);
>              }
>          }
>      }
> }
>
>
> So, to create directory and move files... I get the documentation
> on that page: http://dlang.org/phobos/std_file.html
>
> But, I don't know, How I can get the file information and what is
> the best way to create the directory's, so, I need some help :)
>
> I appreciate the help :)

Hi Alexandre,

Would you mind explaining in English what it is that you would like to achieve. I cannot read [what I assume is] Portuguese, but if you can explain what you wan't I will try my best to help.
August 26, 2013
 I wonder if any of this would make any more sense if you threw it through Google translate.. (maybe the comments and months?)



On Monday, 26 August 2013 at 20:14:34 UTC, Andre Artus wrote:
> Hi Alexandre,
>
> Would you mind explaining in English what it is that you would like to achieve. I cannot read [what I assume is] Portuguese, but if you can explain what you want I will try my best to help.

 From what I can tell he's making a directory either per day of the month, or per month, then moving all files last created/modified to those directories.



On Monday, 26 August 2013 at 13:30:38 UTC, Alexandre wrote:
>                  foreach (var fi in files)
>                  {
>                      var mes = fi.CreationTime.Month;
>                      var strdt =
> fi.CreationTime.ToString("dd-MM-yyyy");
>
>                      string DestDir = DirReceb + MesesDoAno[mes -
> 1] + "\\" + strdt + "\\" + fi.Name;
>
>                      File.Move(fi.Name, DestDir);
>                  }
>              }
>          }
>      }

August 26, 2013
On Monday, 26 August 2013 at 13:30:38 UTC, Alexandre wrote:
> Hi :)
>
> I'm starting with D language... and, I try to convert a C# code
> to D...
> So, my C# code, I get file informations, and, I create folders
> with all days of month of specific year...
>
> So, that is my C# code...
>
-- SNIP --

> So, to create directory and move files... I get the documentation
> on that page: http://dlang.org/phobos/std_file.html
>
> But, I don't know, How I can get the file information and what is
> the best way to create the directory's, so, I need some help :)
>
> I appreciate the help :)

Okay, I banged together something that may be close to what you want. I'm not a D expert, so someone is sure to point out some areas for improvement.

There does not seem to be any reason to use objects/classes for what you want. In fact if I was to write it in C# I would make the methods static.

As an aside: it's not generally considered good practice to do expensive computations or IO in a constructor (BOCTAOE).

I did not split building the archive directory structure from the file moving part. I prefer to only create a directory if there is going to be a file in it. This may have a impact on performance, but I suspect it is negligible. If it's an issue measure, measure, measure.


module main;

import std.stdio, std.algorithm, std.conv;
import std.array, std.random, std.datetime;
import std.file, std.path, std.utf, std.string;


int main(string[] argv)
{
  // string prefixed with 'r' similar to '@' in C#
  auto searchPath = r"G:\archivetest\search";
  auto archivePath = r"G:\archivetest\archive";

  moveToArchive(searchPath, archivePath);

  return 0;
}

void moveToArchive(string searchPath, string archivePath)
{
  // This ought to be a library thing.
  immutable string[12] MesesDoAno =
  [
    "Janeiro", "Fevereiro",
    "Marco", "Abril",
    "Maio", "Junho",
    "Julho", "Agosto",
    "Setembro", "Outubro",
    "Novembro", "Dezembro"
  ];

  // http://dlang.org/phobos/std_file.html#.dirEntries
  auto de = dirEntries(searchPath,"*.RE{M,T}", SpanMode.shallow, false);

  // Sorting not required, just a personal preference
  auto sortedFiles =
    de.array.sort!((DirEntry x, DirEntry y)
      => x.timeLastModified < y.timeLastModified);

  foreach(DirEntry e; sortedFiles) {
    // I'm being extra verbose here so that it's easy to follow in a debugger

    auto tlm = e.timeLastModified;

    auto _year = tlm.year;
    auto _month = tlm.month;
    auto _day = tlm.day;

    auto yearString = to!(string)(_year);
    auto monthString = MesesDoAno[tlm.month - Month.jan];

    // there ought to be a date formatting function. I can't find it.
    auto dayString = format("%04d-%02d-%02d", _year, _month, _day);

    string movePath = buildPath(archivePath, yearString, monthString);

    bool makeDir = !(movePath.exists && movePath.isDir);

    if(makeDir)
      mkdirRecurse(movePath);

    auto renamedFile = buildPath(movePath, e.name.baseName);

    writefln("%s -> %s", e.name, renamedFile);

    //rename(e.name, renamedFile );
    //uncomment above line if all looks good.
  }
}
August 26, 2013
On Monday, 26 August 2013 at 21:43:20 UTC, Era Scarecrow wrote:
>  I wonder if any of this would make any more sense if you threw it through Google translate.. (maybe the comments and months?)

I did just that :)

> On Monday, 26 August 2013 at 20:14:34 UTC, Andre Artus wrote:
>> Hi Alexandre,
>>
>> Would you mind explaining in English what it is that you would like to achieve. I cannot read [what I assume is] Portuguese, but if you can explain what you want I will try my best to help.
>
>  From what I can tell he's making a directory either per day of the month, or per month, then moving all files last created/modified to those directories.

I always try to understand the person's intention. The obvious answer isn't always the best solution. Someone may be asking "what route should I take to sail my lilo [inflatable raft] to Perth?"
August 26, 2013
On Monday, 26 August 2013 at 23:32:26 UTC, Andre Artus wrote:
> On Monday, 26 August 2013 at 13:30:38 UTC, Alexandre wrote:
>> Hi :)
>>
>> I'm starting with D language... and, I try to convert a C# code
>> to D...
>> So, my C# code, I get file informations, and, I create folders
>> with all days of month of specific year...
>>
>> So, that is my C# code...
>>
> -- SNIP --
>
>> So, to create directory and move files... I get the documentation
>> on that page: http://dlang.org/phobos/std_file.html
>>
>> But, I don't know, How I can get the file information and what is
>> the best way to create the directory's, so, I need some help :)
>>
>> I appreciate the help :)
>
> Okay, I banged together something that may be close to what you want. I'm not a D expert, so someone is sure to point out some areas for improvement.
>
> There does not seem to be any reason to use objects/classes for what you want. In fact if I was to write it in C# I would make the methods static.
>
> As an aside: it's not generally considered good practice to do expensive computations or IO in a constructor (BOCTAOE).
>
> I did not split building the archive directory structure from the file moving part. I prefer to only create a directory if there is going to be a file in it. This may have a impact on performance, but I suspect it is negligible. If it's an issue measure, measure, measure.
>
>
> module main;
>
> import std.stdio, std.algorithm, std.conv;
> import std.array, std.random, std.datetime;
> import std.file, std.path, std.utf, std.string;
>
>
> int main(string[] argv)
> {
>   // string prefixed with 'r' similar to '@' in C#
>   auto searchPath = r"G:\archivetest\search";
>   auto archivePath = r"G:\archivetest\archive";
>
>   moveToArchive(searchPath, archivePath);
>
>   return 0;
> }
>
> void moveToArchive(string searchPath, string archivePath)
> {
>   // This ought to be a library thing.
>   immutable string[12] MesesDoAno =
>   [
>     "Janeiro", "Fevereiro",
>     "Marco", "Abril",
>     "Maio", "Junho",
>     "Julho", "Agosto",
>     "Setembro", "Outubro",
>     "Novembro", "Dezembro"
>   ];
>
>   // http://dlang.org/phobos/std_file.html#.dirEntries
>   auto de = dirEntries(searchPath,"*.RE{M,T}", SpanMode.shallow, false);
>
>   // Sorting not required, just a personal preference
>   auto sortedFiles =
>     de.array.sort!((DirEntry x, DirEntry y)
>       => x.timeLastModified < y.timeLastModified);
>
>   foreach(DirEntry e; sortedFiles) {
>     // I'm being extra verbose here so that it's easy to follow in a debugger
>
>     auto tlm = e.timeLastModified;

When testing I used timeLastModified as that created the greatest variability with the files I had at my disposal. If you need to use the file creation time then replace with timeCreated, as follows:

auto sortedFiles = de.array.sort!((x, y) => x.timeCreated < y.timeCreated);
foreach(DirEntry e; sortedFiles) {
  auto tlm = e.timeCreated;