powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Утечка памяти
25 сообщений из 28, страница 1 из 2
Утечка памяти
    #37648788
mar55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простенькая программка по перекладыванию файлов из директории в директорию. Где-то идет утечка памяти. Что не так? где-то 8-10 кб за проход одного цикла. Не вижу где...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {   
        static List<FileInfo> _Files_;
        static List<string> _FilesRead_ = new List<string>();
        static char[] cr_ = new char[100];
        static bool type_ = false;
        static string critname = "";
        static string crittype = "";
        static string name = "";
        static string type = "";
        static List<DirCrit> HF = new List<DirCrit>();
        static bool flagsecond = false;
        static bool flagthird = false;
        static string crit = "";
        static char[] y;
        static DirCrit hf;
        static int i=0;
        static int j = 0;

        static void Main(string[] args)
        {
                string dirlistcrit = "";
                string filelistcrit = "";
                string dirlog = "";
                string logname = "";
                string dirdirectories = "";
                string directoriesname = "";
            
            try
            {
                int i = 0;
                foreach (string s in args)
                {
                    i++;
                  
                    if (i == 1) dirlistcrit = s;
                    if (i == 2) filelistcrit = s;
                    if (i == 3) dirlog = s;
                    if (i == 4) logname = s;
                }
                ToFile Files = new ToFile();
                //читаем директории и признаки
                List<string> ListDir = new List<string>();
                ListDir = Files.ReadFromFile(dirlistcrit + filelistcrit);
                List<DirCrit> DirCrit = new List<DirCrit>();
                DirCrit = ToDirCrit(ListDir);
                DirectoryInfo Dirictory;

                _Files_ = new List<FileInfo>();
                              
                // читаем директории для чтения
                while (true)
                {
                    foreach (DirCrit dircrit in DirCrit)
                    {
                        Dirictory = new DirectoryInfo(dircrit.DirFrom);
                        ReadCatalogs(Dirictory);
                        foreach (FileInfo filename in _Files_)
                        {                           
                            if (Check(filename, dircrit.Crit))
                            {
                                Files.CopyFiles(dircrit.DirTo, dircrit.DirFrom, filename);
                                if(File.Exists(dircrit.DirTo+(filename.FullName.TrimStart(dircrit.DirFrom.ToCharArray()))))
                                {
                                    Files.DeleteFile(filename);
                                }
                            }
                        }
                        _Files_.Clear();
                    }
                    _Files_.Clear();
                    Thread.Sleep(60000);
                }
            }
            catch (Exception e)
            {
                ToFile File_ = new ToFile();
                List<string> f = new List<string>();
                f.Add("Упала " + e.Message);
             //тут запись в лог - пока не реализовано  
            }
            finally { }
        }

       public static bool Check(FileInfo filename, List<string> crit)
        { 
             type_ =false;
             critname ="";
             crittype = "";
             name = "";
             type = "";

            foreach (char cr_letter in filename.Name)
            {
                if ((cr_letter != '.') && (type_ == false))
                {
                    name += cr_letter;
                }
                if (cr_letter == '.') type_ = true;
                if ((cr_letter != '.') && (type_ == true))
                {
                    type += cr_letter;
                }
            }

            foreach (string cr in crit)
            {
                cr_ = cr.ToCharArray();
              
                type_ = false;
                foreach (char cr_letter in cr_)
                {
                    if ((cr_letter != '.') && (type_ == false))
                    {
                        critname += cr_letter;
                    }
                    if (cr_letter == '.') type_ = true;
                    if ((cr_letter != '.') && (type_ == true))
                    {
                        crittype += cr_letter;
                    }
                }

                if (((critname == "*") & (crittype == "*")) == true)
                {
                    return true;
                }
                else if ((critname == "*") & (crittype != "*"))
                {
                    if (type == crittype) return true;
                }
                else if ((critname != "*") & (crittype == "*"))
                {
                    if ((critname.StartsWith("%") == true) & (critname.EndsWith("%") == true))
                    {
                        if (name.Contains(critname.TrimStart('%').TrimEnd('%'))) return true;
                    }
                    if ((critname.StartsWith("%") == false) & (critname.EndsWith("%") == true))
                    {
                        if (name.StartsWith(critname.TrimEnd('%'))) return true;
                    }
                    if ((critname.StartsWith("%") == true) & (critname.EndsWith("%") == false))
                    {
                        if (name.EndsWith(critname.TrimStart('%'))) return true;
                    }
                    
                }
                else if ((critname != "*") & (crittype != "*"))
                {
                    if (type == crittype)
                    {
                        if ((critname.StartsWith("%") == true) & (critname.EndsWith("%") == true))
                        {
                            if (name.Contains(critname.TrimStart('%').TrimEnd('%'))) return true;
                        }
                        if ((critname.StartsWith("%") == false) & (critname.EndsWith("%") == true))
                        {
                            if (name.StartsWith(critname.TrimEnd('%'))) return true;
                        }
                        if ((critname.StartsWith("%") == true) & (critname.EndsWith("%") == false))
                        {
                            if (name.EndsWith(critname.TrimStart('%'))) return true;
                        }
                    }
                   
                }

                critname = "";
                crittype = "";
               
            }
            return false;

        }
       public static void ReadCatalogs(DirectoryInfo di)
       {
           try
           {
               foreach (DirectoryInfo Directory in di.GetDirectories())
               {
                   ReadCatalogs(Directory);
               }
               foreach (FileInfo File in di.GetFiles())
               {
                   _Files_.Add( File);
               }
           }
           catch
           {
               Console.WriteLine( DateTime.Now.ToString() + " Error 001. Ошибка чтения каталога.");
           }
        }

       public static List<DirCrit> ToDirCrit(List<string> list)
       {
           HF.Clear();
           try
           {
               
               flagsecond = false;
               flagthird = false;
               crit = "";
               for (i = 0; i < list.Count; i++)
               {
                   flagthird = false;
                   flagsecond = false;
                   hf = new DirCrit();
                   hf.Crit = new List<string>();
                   y = list[i].ToCharArray();
                   for (j = 0; j < list[i].Length; j++)
                   {
                       if (( y[j]!= ';')&&(flagsecond==false))
                       {
                           hf.DirFrom += y[j];
                       }
                       if ((y[j] == ';') && (flagsecond == true) && (flagthird == false))
                       {
                           flagthird = true;
                       }
                       if ((y[j] == ';') && (flagsecond == false) && (flagthird == false))
                       {
                           flagsecond = true;
                       }
                       if ((y[j] != ';') && (flagsecond == true)&&(flagthird == false))
                       {
                           if (y[j] != '|')
                           {
                              crit += y[j];
                           }
                           else
                           {
                               hf.Crit.Add(crit);
                               crit = "";
                           }
                       }
                       
                       if ((y[j] != ';') && (flagsecond == true) && (flagthird == true))
                       {
                           hf.DirTo += y[j];
                       }

                   }
                   
                       HF.Add(hf);
                   
               }
           }
           catch (Exception e)
           {
               Console.WriteLine(DateTime.Now.ToString() +" Error Ошибка преобразования в тип FileDate");
           }

           return HF;
       }
 
    }

    class DirCrit
    {
        public string DirFrom;
        public List<string> Crit;
        public string DirTo;      
    }

    class Catalog
    {
        public string Dir;
        public string Name;
    }

   
    class ToFile
    {
        public ToFile() {}
        string fn = "";
        string fn_ = "";
        char[] fileName___;
        int i;
        DirectoryInfo dr;
        FileInfo fileinf;
        string line;
        FileStream F;
        StreamReader SW;
        List<string> filenamelist = new List<string>();

        public bool FileCopy (string fileName, string dir, string dirread)
        {
            try
            {
                 fn = "";
                 fn_ = "";
                 fileName___ = fileName.ToCharArray();
                for ( i = fileName___.Length-1; i >= 0; i--)
                {
                     if (fileName___[i] == '\\')
                     {
                         i=0;
                     }
                     else
                     {
                         fn =  fileName___[i]+fn;
                     }
                }

                fn_ = fileName.Substring(0, fileName.Length - fn.Length);
                dr = new DirectoryInfo(dirread + fn_.Substring(dir.Length)+"\\");
                if (Directory.Exists(dr.FullName) == false)
                {
                    Directory.CreateDirectory(dr.FullName);
                }
             
                fileinf = new FileInfo( fileName);
                fileinf.CopyTo(dr.FullName + fn, true);
                return true;
            }
            catch(Exception e)
            {
                return false;
            }
            return false;
        }
      
        public void DeleteFile(FileInfo  filename)
        {
            try
            {
                filename.Delete();
               
                
            }
            catch (Exception e)
            {
                Console.WriteLine(DateTime.Now.ToString() + " Error 002. Ошибка удаления файла. " + e.Message);
            }
        }
        public void CopyFiles(string dir_to, string dir_from, FileInfo filename)
        {
            try
            {
                
               if (File.Exists(filename.FullName))
                {
                   
                    if (File.Exists(dir_to + filename.FullName.Substring(dir_from.Length)) == true) File.Delete(dir_to + filename.FullName.Substring(dir_from.Length));
                    File.Copy(filename.FullName, dir_to + filename.Name.Substring(dir_from.Length));
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(DateTime.Now.ToString() + " Error 002. Ошибка копирования в файла. " + e.Message);
            }
        }
    
        public List<string> ReadFromFile(string filename)
        {
            filenamelist.Clear();
            try
            {
                 F = new FileStream(filename, FileMode.Open);
                 SW = new StreamReader(F);

                while ((line = SW.ReadLine()) != null)
                {
                    filenamelist.Add(line);
                }

                SW.Close();
                F.Close();
            }
            catch
            {
                Console.WriteLine( DateTime.Now.ToString() +" Error 003. Ошибка чтения файла. Возможно файл " + filename + " не существует");
            }
            return filenamelist;
        }
    }
}
...
Рейтинг: 0 / 0
Утечка памяти
    #37648840
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mar55555,

Чтобы получить утечку памяти в .NET - это надо постараться; другое дело, что сборщик мусора вполне может считать, что мусора пока мало и напрягаться с уборкой не стоит. Если влепить в цикл GC.Collect(), что-нибудь изменится?
Хотя код, как бы так помягче сказать, своеобразный...
...
Рейтинг: 0 / 0
Утечка памяти
    #37648969
mar55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет. не поменялось. а что с кодом не так?
...
Рейтинг: 0 / 0
Утечка памяти
    #37648972
mar55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
за час работы выросло с 1620 кб до 1716 кб. это тест без сборщика.
...
Рейтинг: 0 / 0
Утечка памяти
    #37649050
mar55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
те без GC.Collect().
...
Рейтинг: 0 / 0
Утечка памяти
    #37649067
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mar55555за час работы выросло с 1620 кб до 1716 кб. это тест без сборщика.
[сарказм]Да у тебя не утечка, а прям потоп[/сарказм]
...
Рейтинг: 0 / 0
Утечка памяти
    #37649071
mar55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну просто эта прога будет работать 7х24 и придется ее перезапускать периодически. а хочется повесил и забыл.
...
Рейтинг: 0 / 0
Утечка памяти
    #37649077
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mar55555,

а с чего ты взял что там утечка?
...
Рейтинг: 0 / 0
Утечка памяти
    #37649081
mar55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну когда потребление памяти в диспетчере задач увеличивается стабильно раз в минуту. а цикл проходит как раз раз в минут, то что это?
...
Рейтинг: 0 / 0
Утечка памяти
    #37649085
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mar55555ну когда потребление памяти в диспетчере задач увеличивается стабильно раз в минуту. а цикл проходит как раз раз в минут, то что это?
пока пару сотен метров не съест - не переживай.
...
Рейтинг: 0 / 0
Утечка памяти
    #37649091
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mar55555,


но вообще то что ты написал - это жесть. и на сисярпе так не пишут.
...
Рейтинг: 0 / 0
Утечка памяти
    #37649098
mar55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а можно пару примеров того как не стоит делать? просто я самоучка. пишу, если нужно какие-то простенькие задачки решить. особо никто никогда мой код не смотрел, тк контора не проганием занимается.
...
Рейтинг: 0 / 0
Утечка памяти
    #37649101
mar55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
куча статиков появилась только из-за попытки выяснить на что память уходит.
...
Рейтинг: 0 / 0
Утечка памяти
    #37649107
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mar55555а можно пару примеров того как не стоит делать? просто я самоучка. пишу, если нужно какие-то простенькие задачки решить. особо никто никогда мой код не смотрел, тк контора не проганием занимается.
та забей. считай что я пошутил
...
Рейтинг: 0 / 0
Утечка памяти
    #37649112
mar55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да мне просто интересно) всегда полезно, когда тебе показывают в чем твои косяки. лан, забью)
...
Рейтинг: 0 / 0
Утечка памяти
    #37649118
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mar55555да мне просто интересно) всегда полезно, когда тебе показывают в чем твои косяки. лан, забью)
для этого просто в команде нужно поработать.
а так да, трудно научиться писать - понятный другим код. ведь тебе он понятен, задачу решает, ну и что от него еще нужно.
...
Рейтинг: 0 / 0
Утечка памяти
    #37649122
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mar55555,

да и задачи такие не на сисярпах решают, а на скриптовых языках.
если такой уж заядлый дотНетчик - то можешь эф-шарп для скриптования юзать.
там тебе и не придется классы эти воротить с статиками, будишь писать ровно то - что нужно для задачи, без этого ОО-мусора.
...
Рейтинг: 0 / 0
Утечка памяти
    #37649130
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mar55555GC.Collect()
а попробуй с ручным вызвом, что-бы понять в чем проблема.
а то может система просто не хочет чистить, так как ты еще занял очень мало памяти.
...
Рейтинг: 0 / 0
Утечка памяти
    #37649137
mar55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ага. дома уже запущу на часик, посмотрю, что получится.
...
Рейтинг: 0 / 0
Утечка памяти
    #37649354
NoLock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Невооруженным взглядом видно два места:
1) f.Add("Упала " + e.Message);
2) using(StreamReader SW = new StreamReader(F))

И ZyK_BotaN прав - так на C# не пишут...
...
Рейтинг: 0 / 0
Утечка памяти
    #37649425
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NoLock,

а как блл пишут???
...
Рейтинг: 0 / 0
Утечка памяти
    #37649475
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosNoLock,

а как блл пишут???
мало того что не так пишут, дак еще и задача не для сисярпа.
пускай скриптовый язык берет.
...
Рейтинг: 0 / 0
Утечка памяти
    #37649499
Фотография С0ВЕСТЬ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простой системный скрипт разве не потянет?
...
Рейтинг: 0 / 0
Утечка памяти
    #37649502
mar55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скриптовый я, к сожалению, не знаю. Пишу на чем знаю. Все равно лучше, чем никак. Будет висеть как обработчик и если будут какие-то проблемы - сразу будет видно. Ночью конешн не сильно спасет, а вот днем полезно будет. Отсутствие файлов за день тоже признак проблем, тока скорее не у нас) Так что для моего случая, может и сойдет.

Итог тестирования. Немного причесав код, получилось что с 1392 Кб дорос до 1468 и на этом успокоился. Дальше уверенно держится на этой планке.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {  
        static List<FileInfo> _Files_;
        
        static void Main(string[] args)
        {
            string dirlistcrit = "";
            string filelistcrit = "";
            string dirlog = "";
            string logname = "";
              
            try
            { 
                int i = 0;
                foreach (string s in args)
                {
                    i++;
                    if (i == 1) dirlistcrit = s;
                    if (i == 2) filelistcrit = s;
                    if (i == 3) dirlog = s;
                    if (i == 4) logname = s;
                }
                if ((dirlistcrit != "") && (filelistcrit != "") && (dirlog != "") && (logname != ""))
                {
                    LogWrite log = new LogWrite(dirlog + logname);
                    ToFile Files = new ToFile();
                    //читаем директории и признаки
                    List<string> ListDir = new List<string>();
                    ListDir = Files.ReadFromFile(dirlistcrit + filelistcrit, log);
                    List<DirCrit> DirCrit = new List<DirCrit>();
                    log.WriteLog("");
                    log.WriteLog(       "*******************************************************************************");
                    log.WriteLog("");
                    log.WriteLogConsole("Условия запуска");
                    log.WriteLogConsole("-------------------------------------------------------------------------------");
                    DirCrit = ToDirCrit(ListDir, log);
                    log.WriteLogConsole("-------------------------------------------------------------------------------");
                    DirectoryInfo Dirictory;
                    if (DirCrit.Count != 0)
                    {
                        _Files_ = new List<FileInfo>();

                        // читаем директории для чтения
                        while (true)
                        {
                            foreach (DirCrit dircrit in DirCrit)
                            {
                                Dirictory = new DirectoryInfo(dircrit.GetDirFrom());
                                ReadCatalogs(Dirictory, log);
                                foreach (FileInfo filename in _Files_)
                                {
                                        if (Check(filename, dircrit.GetCrit(), log))
                                        {
                                            log.WriteLogConsole("Обнаружен файл соответствеующий критериям для перемещения");
                                            log.WriteLogConsole("Из " + dircrit.GetDirFrom() + " в " + dircrit.GetDirTo());
                                            
                                            Files.CopyFiles(dircrit.GetToReserve(), dircrit.GetDirFrom(), filename, log);
                                            Files.CopyFiles(dircrit.GetDirTo(), dircrit.GetDirFrom(), filename, log);

                                            if (File.Exists(dircrit.GetDirTo() + (filename.FullName.TrimStart(dircrit.GetDirFrom().ToCharArray()))))
                                            {
                                                Files.DeleteFile(filename, log);
                                            }
                                            log.WriteLogConsole("");
                                        }

                                }
                                _Files_.Clear();
                            }
                            _Files_.Clear();
                            GC.Collect();
                            GC.WaitForPendingFinalizers();
                            GC.Collect();
                            Thread.Sleep(5000);
                        }
                    }
                }
                else
                {
                    Console.WriteLine("Не верные параметры запуска программы");
                    Console.WriteLine("1 - директория для файла со списоком директорий для мониторинга и критериями для копирования ");
                    Console.WriteLine("2 - имя файла со списоком директорий для мониторинга и критериями для копирования ");
                    Console.WriteLine("3 - директория, в которой хранится лог ");
                    Console.WriteLine("4 - имя лог файла ");
                }
            }
            catch (Exception e)
            {
                LogWrite log = new LogWrite("C:\\error.txt");
                log.WriteLogConsole("Произошел сбой програмы. " +e.Message);
              
            }
            finally { }
        }
  
       public static bool Check(FileInfo filename, List<string> crit, LogWrite log)
        {
            try
            {
                string critname = "";
                string crittype = "";
                string name = "";
                string type = "";

                string[] param = filename.Name.Split('.');
                name = param[0];
                type = param[1];

                string[] paramcr;
                foreach (string cr in crit)
                {
                    paramcr = cr.Split('.');
                    critname = paramcr[0];
                    crittype = paramcr[1];

                    if ((critname == "*") & (crittype == "*")) return true;
                    else if ((critname == "*") & (crittype != "*"))
                    {
                        if (type == crittype) return true;
                    }
                    else if ((critname != "*") & (crittype == "*"))
                    {
                        if ((critname.StartsWith("%") == true) & (critname.EndsWith("%") == true))
                        {
                            if (name.Contains(critname.TrimStart('%').TrimEnd('%'))) return true;
                        }
                        if ((critname.StartsWith("%") == false) & (critname.EndsWith("%") == true))
                        {
                            if (name.StartsWith(critname.TrimEnd('%'))) return true;
                        }
                        if ((critname.StartsWith("%") == true) & (critname.EndsWith("%") == false))
                        {
                            if (name.EndsWith(critname.TrimStart('%'))) return true;
                        }

                    }
                    else if ((critname != "*") & (crittype != "*"))
                    {
                        if (type == crittype)
                        {
                            if ((critname.StartsWith("%") == true) & (critname.EndsWith("%") == true))
                            {
                                if (name.Contains(critname.TrimStart('%').TrimEnd('%'))) return true;
                            }
                            if ((critname.StartsWith("%") == false) & (critname.EndsWith("%") == true))
                            {
                                if (name.StartsWith(critname.TrimEnd('%'))) return true;
                            }
                            if ((critname.StartsWith("%") == true) & (critname.EndsWith("%") == false))
                            {
                                if (name.EndsWith(critname.TrimStart('%'))) return true;
                            }
                        }

                    }

                    critname = "";
                    crittype = "";

                }
                return false;
            }
            catch (Exception e)
            {
                log.WriteLogConsole("Error 001. Ошибка сравнения. " + e.Message);
                return false;
            }

        }
       public static void ReadCatalogs(DirectoryInfo di, LogWrite log)
       {
           try
           {
               foreach (DirectoryInfo Directory in di.GetDirectories())
               {
                   ReadCatalogs(Directory, log);
               }
               foreach (FileInfo File in di.GetFiles())
               {
                   _Files_.Add( File);
               }
           }
           catch(Exception e)
           {
               log.WriteLogConsole( "Error 002. Ошибка чтения каталога." + e.Message);
           }
        }
       public static List<DirCrit> ToDirCrit(List<string> list, LogWrite log)
       {
           List<DirCrit> HF = new List<DirCrit>();
           try
           {
               DirCrit hf;
               string[] param;
               for (int i = 0; i < list.Count; i++)
               {

                   hf = new DirCrit("", "", new List<string>(), "");
                   param =  list[i].Split(';');
                   if (param.Length == 4)
                   {
                       hf.SetDirFrom(param[0]);
                       hf.SetCrit(new List<string>(param[1].Split('|')));
                       hf.SetDirTo(param[2]);
                       hf.SetDirToReserve(param[3]);

                       HF.Add(hf);

                       log.WriteLogConsole("Копируем из директории " + hf.GetDirFrom() + " в " + hf.GetDirTo() + " резерв " + hf.GetToReserve());
                       log.WriteLogConsole("требования к файлам: " + string.Join("; ", hf.GetCrit().ToArray()));
                       log.WriteLogConsole("");
                   }
                   else
                   {
                       log.WriteLogConsole("Не верные параметры в файле со списоком директорий для мониторинга и критериями для копирования");
                   }
               }
           }
           catch (Exception e)
           {
               log.WriteLogConsole("Error 003. Ошибка преобразования в тип FileDate " + e.Message);
           }
           return HF;
       }
    }

    class LogWrite
    {
        string logname;
        public LogWrite(string Logname){logname = Logname;}
        
        public void WriteLogConsole(string text)
        {
            Console.WriteLine(DateTime.Now.ToString() + " "+text);
            ToFile File = new ToFile();
            File.WriteToFile(logname, DateTime.Now.ToString() + " "+ text);
        }

        public void WriteLog(string text)
        {
            ToFile File = new ToFile();
            File.WriteToFile(logname,DateTime.Now.ToString() + " " +text);
        }
    }

    class DirCrit
    {
        string dirfrom;
        List<string> crit;
        string dirto;
        string dirtoreserve;

        public DirCrit(string DirFrom, string DirTo, List<string> Crit, string DirToReserve)
        { dirfrom = DirFrom; crit = Crit; dirto = DirTo; dirtoreserve = DirToReserve; }

        public string GetDirFrom()
        {
            return dirfrom;
        }
        public string GetDirTo()
        {
            return dirto;
        }
        public string GetToReserve()
        {
            return dirtoreserve;
        }
        public List<string> GetCrit()
        {
            return crit;
        }
        public void SetDirFrom(string c)
        {
            dirfrom = c.Trim();
        }
        public void SetDirTo(string c)
        {
            dirto = c.Trim();
        }
        public void SetDirToReserve(string c)
        {
            dirtoreserve = c.Trim();
        }
        public void SetCrit(List<string> c)
        {
            foreach (string x in c)
            {
                crit.Add(x.Trim()); ;
            }
        }
    }

    struct Catalog
    {
        public string Dir;
        public string Name;
    }

    class ToFile
    {
        public ToFile() {}
        string line;
        List<string> filenamelist = new List<string>();

        public void WriteToFile(string filename, string tofile_list)
        {
            try
            {
                FileStream F = new FileStream(filename, FileMode.Append);
                using (StreamWriter SW = new StreamWriter(F))
                {
                    SW.WriteLine(tofile_list);
                    SW.Close();
                    F.Close();
                }
            }
            catch (Exception e)
            {
                LogWrite log = new LogWrite("C:\\error.txt");
                log.WriteLogConsole( "Error 004. Ошибка записи в файл. " + e.Message);
            }
        }
        
        public void DeleteFile(FileInfo  filename, LogWrite log)
        {
            try
            {
                filename.Delete();     
            }
            catch (Exception e)
            {
                log.WriteLogConsole("Error 005. Ошибка удаления файла. " + e.Message);
            }
        }
             
        public void CopyFiles(string dir_to, string dir_from, FileInfo filename, LogWrite log)
        {
            try
            {
                if (File.Exists(filename.FullName))
                {

                    if (File.Exists(dir_to + filename.FullName.Substring(dir_from.Length)) != true)
                    {
                        File.Copy(filename.FullName, dir_to + filename.FullName.Substring(dir_from.Length));
                        log.WriteLogConsole("Перемещаемый файл: " + filename.FullName);
                    }
                    else
                    {
                        log.WriteLogConsole("В указанной для копирования директории файл уже существует: " + filename.FullName);
                    }
                }
            }
            catch (Exception e)
            {
                log.WriteLogConsole("Error 006. Ошибка копирования в файла. " + e.Message);
            }
        }

        
        public List<string> ReadFromFile(string filename, LogWrite log)
        {
            filenamelist.Clear();
            try
            {
                FileStream F = new FileStream(filename, FileMode.Open); ;
                using (StreamReader SW = new StreamReader(F))
                {
                    while ((line = SW.ReadLine()) != null) { filenamelist.Add(line); }
                    SW.Close();
                }
                F.Close();                
            }
            catch
            {
                log.WriteLogConsole(" Error 007. Ошибка чтения файла. Возможно файл " + filename + " не существует");
            }
            return filenamelist;
        }
    }
   
}
...
Рейтинг: 0 / 0
Утечка памяти
    #37649506
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mar55555,

освой уже спойлер )

а то постишь такие простыни
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Утечка памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]