digitalmars.D.learn - RePost: Help to convert a code to D
- Alexandre (108/108) Aug 26 2013 Hi :)
- bearophile (8/9) Aug 26 2013 If you don't receive answers, then I suggest you to cut your
- Andre Artus (5/118) Aug 26 2013 Hi Alexandre,
- Era Scarecrow (7/24) Aug 26 2013 I wonder if any of this would make any more sense if you threw
- Andre Artus (6/18) Aug 26 2013 I always try to understand the person's intention. The obvious
- Andre Artus (70/83) Aug 26 2013 Okay, I banged together something that may be close to what you
- Andre Artus (10/78) Aug 26 2013 When testing I used timeLastModified as that created the greatest
Hi :) to D... with all days of month of specific year... 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 :)
Aug 26 2013
Alexandre: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
Aug 26 2013
On Monday, 26 August 2013 at 13:30:38 UTC, Alexandre wrote:Hi :) to D... with all days of month of specific year... 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.
Aug 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); } } } }
Aug 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: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?"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.
Aug 26 2013
On Monday, 26 August 2013 at 13:30:38 UTC, Alexandre wrote:Hi :) to D... with all days of month of specific year...-- 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 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) { 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" ]; 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. } }
Aug 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: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;Hi :) to D... with all days of month of specific year...-- 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 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) { 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" ]; 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;
Aug 26 2013