Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в себя 
:(
    Опции темы
yarus88
Дата 17.5.2010, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Люди добрые подскажите.
Нужно создать экзешник который при запуске сам в себя записывает информацию, как это можно реализовать? 
PM MAIL   Вверх
Partizan
Дата 17.5.2010, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



yarus88, какую информацию, зачем?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
yarus88
Дата 17.5.2010, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



дату последнего открытия.... задание такое.....
PM MAIL   Вверх
jonie
Дата 17.5.2010, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



yarus88, в windows файл блокируется на запись на время выполнения (осталось еще со времен DOS-а). Вам либо надо делать копию себя и "перезапускаться" либо искать в таблицах лоченых дескрипторов свой (что далеко не тривиальная задача и очень завязана на версию винды).....
В общем простой ответ - копировать себя и из копии что надо делать.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Heinzz
Дата 18.5.2010, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Однако не стоит спешить запускать программу повторно сразу, подождите 7сек. Это конечно можно обойти, но...
Код

class Program
    {
        static string dir = Directory.GetCurrentDirectory();
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("Last access time\t" + File.GetLastAccessTime(dir + "\\SaveMe.exe"));
                Console.ReadKey();

                //Main Program

                if (File.Exists(dir + "\\SaveMeCopy.exe"))
                {
                    File.Delete(dir + "\\SaveMeCopy.exe");
                }
                File.Copy(dir + "\\SaveMe.exe", dir + "\\SaveMeCopy.exe");
                Process p = new Process();
                ProcessStartInfo info = new ProcessStartInfo(dir + "\\SaveMeCopy.exe", "Copy");
                info.WindowStyle = ProcessWindowStyle.Hidden;
                p.StartInfo = info;
                p.Start();
            }
            else
            {
                switch (args[0])
                {
                    case "Copy":
                        System.Threading.Thread.Sleep(3000);
                        File.SetLastAccessTime(dir + "\\SaveMe.exe", DateTime.Now);
                        Process p = new Process();
                        ProcessStartInfo info = new ProcessStartInfo(dir + "\\SaveMe.exe", "DeleteCopy");
                        info.WindowStyle = ProcessWindowStyle.Hidden;
                        p.StartInfo = info;
                        p.Start();
                        break;

                    case "DeleteCopy":
                        System.Threading.Thread.Sleep(3000);
                        File.Delete(dir + "\\SaveMeCopy.exe");
                        break;
                }
            }
        }
    }



--------------------
user posted image
PM MAIL   Вверх
yarus88
Дата 18.5.2010, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Heinzz, огромнейшее тебе спасибо!
Тока есть пару вопросов:
1) Зачем нам ждать 7 секунд?
2)что такое args.Length == 0 и a[rgs[0], за что они отвечают?
PM MAIL   Вверх
Heinzz
Дата 19.5.2010, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



перезаписи требуют какого-то времени.
args - массив аргументов командной строки


--------------------
user posted image
PM MAIL   Вверх
jonie
Дата 19.5.2010, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Heinzz, использовать мьютексы (или семафоры или др. средства синхронизации) вполне возможно, нежели "ждать 7 секунд"...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Heinzz
Дата 19.5.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



было бы интересно посмотреть пример. Я ими никогда не пользовался smile 


--------------------
user posted image
PM MAIL   Вверх
jonie
Дата 20.5.2010, 01:10 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



эх и эх.. а еще MCTS (я правди никогда не верил особо сертификатам)...
Код

    class Program
    {
        private const string semaphoreName = "semaphore";
        
        //обозначения:
        //сервер - тот кто запускает (первый экземпляр)
        //клиент - запускаемый вторым
        static void Main(string[] args)
        {
            if(args.Length>0)
            {
                //я клиент!
                //эумулятор длительной операции
                Thread.Sleep(10000);

                //уведомляем сервер что мы всё сделали
                Semaphore sem = Semaphore.OpenExisting(semaphoreName);
                sem.Release();
                //теперь сервер
            }
            else
            {
                //я сервер
                Semaphore sem = new Semaphore(0, 1, semaphoreName);

                Process p = new Process(); 
                ProcessStartInfo info = new ProcessStartInfo(Assembly.GetExecutingAssembly().Location, "ты_клиент");
                p.StartInfo = info;
                p.Start();
                //ждем пока запустится

                Console.WriteLine("Waiting....");
                sem.WaitOne();
                Console.WriteLine("All DONE!");
            }
        }
    }

ну примерно так...
конечно, стоит делать следующую штуку:
1) копируем себя
2) запускаем копию передав аргументом свое местоположение
3) выходим убедившись что копия запустилась (как раз семафор их примера поможет)
4) копия делает изменения
5) копия запускает сервер с параметром "всё сделано" (параметр нужен чтобы сервер еще раз не повторил итерацию начиная с п1)
....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Heinzz
Дата 20.5.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



что-то семафоры не сообщают когда файл разлочится smile таймаут нужен всеравно?


--------------------
user posted image
PM MAIL   Вверх
jonie
Дата 20.5.2010, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Heinzz, семафор умрет (с эксепшеном) при ожидании в клиенте, когда винда выгрузит процесс, владеющим им (сервер) (если сам сервер не зарелизит его)... чуете чем пахнет?) Мы можем с бОльшой долей вероятности сказать что после этого момента родительский экзешник будет освобожден если не сразу, то "почти сразу" - а дальше начинать писать (или отлочивать семафор перед выходом самым, без эксепшенов чтобы) .... просто при записи надо делать цикл в три итерации с задержкой (небольшой, типа i*500 мсек) при ошибке....

Это сообщение отредактировал(а) jonie - 20.5.2010, 22:17


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Heinzz
Дата 22.5.2010, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Цитата(jonie @  20.5.2010,  22:14 Найти цитируемый пост)
просто при записи надо делать цикл в три итерации с задержкой (небольшой, типа i*500 мсек) при ошибке....

получается что нам здесь семафор и не нужен?


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.