2014-10-29 1 views
1

Я работаю над проектом C#, и мне нужно, чтобы файл удалялся через 30 секунд. Поэтому, как только файл отправляется на компьютер, мне нужно программное обеспечение для подсчета до 30 секунд и в то же время покажите брызговую форму и через 30 секунд закройте заставку, а затем удалите файл.Как удалить файл через 30 секунд/или удалить файл после завершения задания

Я добавил заставку под названием «изображение». Итак, теперь, что происходит, данные отправляются только на принтер после закрытия заставки. Мне нужно многопроцессорное задание. Я имею в виду, что данные должны печататься с одной стороны, пока экран всплеска должен отображаться одновременно. Есть ли способ, которым я могу выйти !! .. Пожалуйста, помогите мне.

Так что в моем случае я копирую файл в папку bin/debug. затем отправляет данные на машину одновременно показывать заставку в течение 30 секунд и закройте экранную заставку, а затем мне нужно удалить файл ..

коды:

private void button4_Click(object sender, EventArgs e) 
    { 
     //string filePath = image_print(); 
     // MessageBox.Show(filePath, "path"); 
     string s = image_print() + Print_image(); 
     if (String.IsNullOrEmpty(s) || img_path.Text == "") 
     { 
      return; 
     } 
     else 
     { 
     //here its coming to the splash screen code, But data is transferred to the machine only after the splash screen is close :-(
      this.Hide(); 
     omg = new image(); 
     omg.ShowDialog(); 
     this.Show(); 
     //splash screen closed and then data is transferred.. which i don't need.. i need simultaneous job to be done at the same time.. 
     PrintFactory.sendTextToLPT1(s); 
     } 
    } 

    private string image_print() 
    { 
     OpenFileDialog ofd = new OpenFileDialog(); 
     string path = ""; 
     string full_path = ""; 
     string filename_noext = ""; 
     ofd.InitialDirectory = @"C:\ZTOOLS\FONTS"; 
     ofd.Filter = "GRF files (*.grf)|*.grf"; 
     ofd.FilterIndex = 2; 
     ofd.RestoreDirectory = true; 
     if (ofd.ShowDialog() == DialogResult.OK) 
     { 
      filename_noext = System.IO.Path.GetFileName(ofd.FileName); 
      path = Path.GetFullPath(ofd.FileName); 
      img_path.Text = filename_noext; 
      //MessageBox.Show(filename_noext, "Filename"); - - -> switching.grf 
      // MessageBox.Show(full_path, "path"); 
      //move file from location to debug 
      string replacepath = @"\\bin\Debug"; 
      string fileName = System.IO.Path.GetFileName(path); 
      string newpath = System.IO.Path.Combine(replacepath, fileName); 
      // string newpath = string.Empty; 
      if (!System.IO.File.Exists(filename_noext)) 
       System.IO.File.Copy(path, newpath); 
      filename_noext = img_path.Text; 
     MessageBox.Show(filename_noext, "path"); 
     } 

     if (string.IsNullOrEmpty(img_path.Text)) 
      return "";// 

     StreamReader test2 = new StreamReader(img_path.Text); 
     string s = test2.ReadToEnd(); 
     return s; 
    } 


    private string Print_image() 
    { 
     //some codes 
      return s; 
    } 

В форме изображения: У меня есть следующие коды

public partial class image : Form 
{ 
    string filePath; 
    public image() 
    { 
     InitializeComponent(); 
     // this.filePath = FileToDeletePath; 

     System.Timers.Timer timer1 = new System.Timers.Timer(); 
     timer1.Interval = 30000; 
     timer1.Elapsed += timer1_Elapsed; 
     timer1.Start(); 
    } 

    private void image_Load(object sender, EventArgs e) 
    { 

    } 

    void timer1_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     //delete the file using "filePath" 
     string Filename = img_path.Text; // here i cannot pass the old string file name with extension to this form.. Any ways please help me out 

     if (string.IsNullOrEmpty(Filename)) 
      return; 

     if (Filename.ToCharArray().Intersect(Path.GetInvalidFileNameChars()).Any()) 
      return; 

     File.Delete(Path.Combine(@"\\bin\Debug", Filename)); 
    } 

} 
+0

Обратите внимание, что она выглядит так, чтобы закрыть, чтобы скопировать пасту ваш [предыдущий вопрос] (http://stackoverflow.com/questions/26618555/how-to-delete-the-file-after-30-seconds). По крайней мере, обязательно укажите атрибут автора второй половины кода и объясните, как этот вопрос существенно отличается. –

+0

Вы говорите о отправке файла на компьютер, а затем из ниоткуда вы говорите о принтере. Я смущен. Почему этот файл поступает на машину? Когда он печатается? Для чего нужен экран заставки? Это на вашей машине или машине, получающей файл? –

+0

, если оба решения правильны, вы можете использовать любой из них. Но я знаю, что у вас возникают проблемы с его внедрением. Во-вторых, вам не нужно использовать метод ShowDialog(). вы можете использовать метод 'Show()'. После этой строки вам просто нужно вызвать метод sleep из класса threading и задать интервал в миллисекундах. Приложение будет останавливаться на заданный интервал в миллисекундах, после чего оно будет продолжено. Теперь, после спящего метода, вы можете написать код для удаления файла, а в и вы можете закрыть всплывающее окно, вызвав метод 'omg.Close()'. – Shell

ответ

1

Ответ Narzul и Peter оба правильные. Вы можете реализовать любой. Но я знаю, что ваш следующий вопрос будет заключаться в том, как реализовать этот метод в вашем коде.

Вы можете использовать Thread или Task объект класса для разделения процесса. Поэтому, когда один процесс запускается, другой процесс может выполнять свои taks в то время. В вашем логине есть два процесса. Первый из них отправляет файл на принтер, а второй - это диалоговое окно показа в течение 30 секунд, а затем удаляет файл. Вы должны создать другой поток для вызова любого из процессов, чтобы другой процесс мог выполнять асинхронно.

1-й: сделать отдельный процесс для печати файла.

Task waitfordelete = Task.Run(() => 
{ 
    PrintFactory.sendTextToLPT1(s); 
}); 

this.Hide(); 
omg = new image(); 
omg.ShowDialog(); 
this.Show(); 

второй: сделать отдельный процесс диалога шоу и удалить файл. Но, я думаю, вы можете получить ошибку в этом методе.Вы не можете изменить пользовательский интерфейс из другого потока

Task waitfordelete = Task.Run(() => 
{ 
    Dispatcher.Invoke(() => this.ShowSplashScreen()); 
}); 

PrintFactory.sendTextToLPT1(s); 


private void ShowSplashScreen() 
{ 
    this.Hide(); 
    omg = new image(); 
    omg.ShowDialog(); 
    this.Show();   
} 

, если вы не хотите использовать нить или задачу, то просто обрабатывать близкое событие Image формы

this.Hide(); 
omg = new image(); 
omg.Show(); 
PrintFactory.sendTextToLPT1(s); 
omg.FormClosed += (object sender, EventArgs e) => { 
    File.Delete(Path.Combine(Application.StartupPath, Path.GetFileName(img_path.Text)); 
    this.Show();  
}; 

и измените код в timer_tick события в Image и добавьте this.Close() после удаления файла.

void timer1_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    .... 
    //File.Delete(Path.Combine(@"\\bin\Debug", Filename)); comment this line 
    this.Close(); 
} 

Еще один скрытый вопрос, который я нашел здесь. здесь я не могу передать старое имя строки файла с расширением этой формы .. Любые способы, пожалуйста, помогите мне

void timer1_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    //delete the file using "filePath" 
    string Filename = img_path.Text; // here i cannot pass the old string file name with extension to this form.. Any ways please help me out 

для этого, вы можете создать свойство в классе изображения и присвоить имя файла из родительского форма.

Image omg = new Image() 
omg.FileName = Path.Combine(Application.StartupPath, Path.GetFileName(img_path.Text)); 
omg.Show(); 

и свойство в виде изображения будет создан, как этот

public class Image : Form 
{ 
    public string FileName { get; set; } 
    public Image() 
    { 
    } 

    void timer1_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     .... 
     File.Delete(Path.Combine(Application.StartupPath, this.Filename)); 
     this.Close(); 
    }   
} 

ПРИМЕЧАНИЕ: Используйте Application.StartupPath istead из \\bin\debug

+0

спасибо большое .. но я получаю ошибку во всех строках :-(в строке 'ask waitfordelete = Task.Run (() =>' его спрашивает меня, хотите ли вы создать класс для задачи, это кажется !! –

+0

в этой строке запрашивается '(отправитель объекта, EventArgs e) => (File.Delete (Path.Combine (Application.StartupPath, Path.GetFileName (img_path.Text))));' не соответствует типу параметров делегата –

2

что-то вроде этого ????

Task waitfordelete = Task.Run(() => 
{ 
    image im = new image(); 
}); 
2

Предположение: окно image должно быть показано, как диалог (модальный), и только в то время как призыв к PrintFactory.sendTextToLPT1 находится в стадии разработки.

Если это верно, то что-то подобное может работать для вас:

// Don't forget, you need to dispose modal dialogs 
image omg = new image(); 

// Ensure the dialog has been shown before starting task. That 
// way the task knows for sure the dialog's been opened and can 
// be closed. 
omg.Loaded += (sender, e) => 
{ 
    // Run the print task in a separate task 
    Task.Run(() => 
    { 
     PrintFactory.sendTextToLPT1(s); 
     // But get back onto the main GUI thread to close the dialog 
     Dispatcher.Invoke(() => omg.Close()); 
    }); 
}; 

this.Hide(); 
omg.ShowDialog(); 
this.Show(); 

Извиняюсь заранее за любые опечатки/синтаксических ошибок/и т.д.. Надеюсь, что этого достаточно, чтобы выразить общую идею.

+0

спасибо за ваш ответ, но я не понимаю, как это реализовать ... его показывая мне много ошибок ...: P –

+1

Я знаю пару опечаток, которые существовали в моем первоначальном редактировании, но они были исправлены с момента вчера. Вы работаете с последней версией ответа? Если это так, вам нужно быть более конкретным, чем «много ошибок». –