При запуске приложения с сервера создается открытый файл на весь срок службы приложения. - PullRequest
0 голосов
/ 06 июня 2019

Я запускаю программу, расположенную на одном из моих файловых серверов. После запуска программы она отображается как Открыть файл в Управление компьютером .

Есть ли способ закрыть этот открытый файл во время работы моей программы, чтобы он не отображался в Управление компьютером ?

Мой код ниже. Я был бы рад выслушать предложения по улучшению моей программы, но на самом деле я просто искал решение, чтобы остановить появление всех этих открытых файлов .

Program.cs - запускает программу, обрабатывает логику для запуска моего приложения

using System;
using System.Windows.Forms;
using System.Diagnostics;

namespace IT_TaskbarApp
{
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        string programName = "TEG System Helper";

        //Process[] proc = Process.GetProcessesByName(programName);

        if (Process.GetProcessesByName(programName).Length == 1)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Primary());
        }
        else
        {
            foreach (Process p in Process.GetProcessesByName(programName))
            {
                if (Process.GetCurrentProcess().Id != p.Id)
                {
                    p.CloseMainWindow();
                    p.Close();
                    p.Kill();
                    p.Dispose();
                }
            }
            Main();
        }
    }
}
}

Primary.cs - создает значок в системных значках, который я могу использовать для отправки уведомлений и простого доступа к утилитам в нашей организации

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Windows.Forms;

namespace IT_TaskbarApp
{
public partial class Primary : Form
{
    private NotifyIcon notifyIcon;
    private ContextMenu contextMenu;
    private MenuItem[] menuItem = new MenuItem[8];
    private IContainer components;
    //private Boolean SendNotices = true;
    private DateTime startTime = DateTime.Now;
    private DateTime currentTime;
    private Icon tegroupIcon = new Icon(Assembly.GetExecutingAssembly().GetManifestResourceStream("IT_TaskbarApp.Src.tegroup.ico"));

    private string prevNotification = "";
    private bool isRunning = true;
    private BackgroundWorker bgNotify = new BackgroundWorker();

    private const string programName = "TEG System Helper";

    public Primary()
    {
        this.FormClosing += Primary_FormClosing; //remove ghost icon in taskbar

        ForeColor = Color.Blue;
        BackColor = Color.Green;


        components = new Container();
        contextMenu = new ContextMenu();

        for (int i = 0; i < menuItem.Length; i++)
        {
            menuItem[i] = new MenuItem();
            menuItem[i].Index = i;
            menuItem[i].Click += new EventHandler(LoadProcess);
        }

        menuItem[0].Text = programName;
        menuItem[1].Text = "Knowledge Base";
        menuItem[2].Text = "Policies";
        menuItem[3].Text = "Feedback";
        menuItem[4].Text = "Global Shop Search";
        menuItem[5].Text = "-";
        menuItem[6].Text = "Submit Ticket";
        menuItem[7].Text = "Send Email";

        //initialize contextMenu
        contextMenu.MenuItems.AddRange(menuItem);



        // Create the NotifyIcon.
        notifyIcon = new NotifyIcon(components)
        {
            Icon = tegroupIcon,
            BalloonTipIcon = new ToolTipIcon(),
            ContextMenu = contextMenu, //the menu when right clicked
            Text = programName,
            Visible = true,
            BalloonTipTitle = programName,

        };

        notifyIcon.DoubleClick += new EventHandler(Icon_DoubleClick);

        InitializeComponent();

        bgNotify.WorkerSupportsCancellation = true;
        bgNotify.WorkerReportsProgress = true;
        bgNotify.DoWork += NotifyUser;
        bgNotify.ProgressChanged += SendNotice;
        //bgNotify.RunWorkerCompleted += BgNotify_RunWorkerCompleted; //enable this to perform an action when the thread dies
        bgNotify.RunWorkerAsync();
        //Thread tNotify = new Thread();
    }

    #region SupportedFunctions

    private void NotifyUser(object Sender, EventArgs e)
    {
        Console.WriteLine("enter");
        while (isRunning)
        {
            currentTime = DateTime.Now;
            #region DisplayCurrentTime
            if (currentTime.Hour < 10 || currentTime.Minute < 10)
            {
                if (currentTime.Hour < 10)
                {
                    if (currentTime.Minute < 10)
                    {
                        Console.WriteLine("0{0}:0{1}", currentTime.Hour, currentTime.Minute);
                    }
                    else
                    {
                        Console.WriteLine("0{0}:{1}", currentTime.Hour, currentTime.Minute);
                    }
                }
                else
                {
                    if (currentTime.Minute < 10)
                    {
                        Console.WriteLine("{0}:0{1}", currentTime.Hour, currentTime.Minute);
                    }
                }
            }
            else
            {
                Console.WriteLine("{0}:{1}", currentTime.Hour, currentTime.Minute);
            }
            #endregion

            FileStream fs = new FileStream("\\\\te-admin\\public\\TaskbarNotices.txt", FileMode.Open);
            StreamReader sr = new StreamReader(fs);
            string noticeText = sr.ReadToEnd();
            sr.Close();
            fs.Close();

            if (noticeText != "" && noticeText != prevNotification)
            {
                prevNotification = noticeText;
                bgNotify.ReportProgress(1);
            }
            else
            {
                bgNotify.ReportProgress(2);
            }


            Console.WriteLine("Inner Text: {0}  TOF: {1}", noticeText, noticeText != "");
            Thread.Sleep(10000);
        }
    }

    private void SendNotice(object Sender, ProgressChangedEventArgs e)
    {
        if (e.ProgressPercentage == 1)
        {
            Console.WriteLine("notification sent");
            this.notifyIcon.BalloonTipText = prevNotification;
            this.notifyIcon.ShowBalloonTip(1500);
        }
    }

    private void LoadProcess(object Sender, EventArgs e)
    {
        if (Sender is MenuItem)
        {
            MenuItem tempMenu = Sender as MenuItem;

            string ProgramTag = "http://";

            switch (tempMenu.Index)
            {
                case 0: //home page
                    ProgramTag += "teg";
                    break;
                case 1: //docviewer
                    ProgramTag += "teg/docViewer";
                    break;
                case 2: //policies
                    ProgramTag += "teg/Policies";
                    break;
                case 3: //feedback
                    ProgramTag += "teg/Feedback";
                    break;
                case 4: //inventory search
                    ProgramTag = "http://searchglobalshop/inventory/index.aspx";
                    break;
                case 6: //submit ticket
                    ProgramTag = "https://timberlandgroup.on.spiceworks.com/portal/tickets";
                    break;
                case 7: //send email
                    string sendto = "admin@tewinch.com";
                    string emailSubject = "Assistance Request";
                    string emailBody = "";
                    string mailto = string.Format("mailto:{0}?Subject={1}&Body={2}", sendto, emailSubject, emailBody);
                    ProgramTag = Uri.EscapeUriString(mailto);
                    break;
            }

            /*
             Try to launch the choice the user made with the default processing method.
             Should the default method fail we try to control how the process is run.
             We open internet explorer and then we show them what to do otherwise.
             */
            #region LaunchSelectedProcess
            try
            {
                if (ProgramTag != "" && ProgramTag != "http://")
                    Process.Start(ProgramTag);
            }
            catch (System.ComponentModel.Win32Exception)
            {
                try
                {
                    if (ProgramTag.StartsWith("http://") || ProgramTag.StartsWith("https://"))
                        Process.Start("iexplore.exe", ProgramTag);
                }
                catch (System.ComponentModel.Win32Exception)
                {
                    Process.Start("control.exe", "/name Microsoft.DefaultPrograms");

                    string message = "";
                    if (tempMenu.Index <= 6)
                    {
                        message = "You must have a default browser set\n\tClick [Set Default Program]\n";

                        if (Environment.OSVersion.ToString().Contains("NT 10.")) //windows 10
                        {
                            message += "\tUnder [Web Browser] Edge is currently set as default\n\tClick on Microsoft Edge\n\tSelect the browser you use";
                        }
                        else //windows 7 -- "NT 6.1")
                        {
                            message += "Select the browser you use\n\tClick [Set this program as default]";
                        }
                    }
                    else
                    {
                        if (Environment.OSVersion.ToString().Contains("NT 10.")) //windows 10
                        {
                            message += "Please setup a default email application";
                        }
                    }

                    message += "\n\nIf this issue persists please contact your Administrator.\nPhone: 519-537-6262\nEmail: admin@tewinch.com";
                    MessageBox.Show(message, "Application Warning", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    //if ( == DialogResult.OK)

                }
            }
            #endregion
        }
    }

    private void Icon_DoubleClick(object Sender, EventArgs e)
    {
        Process.Start("http://teg");
    }
    #endregion


    #region BuiltFunctions
    private void Primary_FormClosing(object sender, FormClosingEventArgs e)
    {
        notifyIcon.Icon = null;
        notifyIcon.Dispose();
        isRunning = false;
        Dispose(true);
    }

    private void InitializeComponent()
    {
        this.SuspendLayout();
        // 
        // Primary
        // 
        this.Icon = tegroupIcon;
        this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
        this.CausesValidation = false;
        this.ClientSize = new System.Drawing.Size(120, 23);
        this.ControlBox = false;
        this.Enabled = false;
        this.MaximizeBox = false;
        this.MinimizeBox = false;
        this.Name = "Primary";
        this.Opacity = 0D;
        this.ShowIcon = false;
        this.ShowInTaskbar = false;
        this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
        this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
        this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
        this.ResumeLayout(false);

    }

    protected override void Dispose(bool disposing)
    {
        // Clean up any components being used.
        if (disposing)
            if (components != null)
                components.Dispose();

        base.Dispose(disposing);
    }
    #endregion
}
}

Вместо отмены программы при запуске я убиваю другие запущенные экземпляры программы. Идея состоит в том, что если с программой возникают какие-либо проблемы, я просто запускаю другой экземпляр и решаю проблемы. Сейчас мало что может пойти не так, но мы будем разрабатывать эту программу, чтобы в будущем выполнить еще много задач.

Единственная область, в которой я могу видеть, где файл остается открытым, - это когда я вытаскиваю Embedded Resource tegroup.ico. Я искал, чтобы увидеть, что я что-то пропустил при открытии этого, но я не мог видеть способ закрыть ManifestResourceStream после прочтения.

Любые советы / предложения были бы замечательными, но опять же, я просто хочу узнать, есть ли способ закрыть эти Открытые файлы

Пример ниже

Открыть файл после запуска приложения

Возможно, я пытаюсь решить что-то, что является известным результатом использования Application.Run () , если это так, пожалуйста, предложите альтернативы, которые я могу использовать. Другими моими идеями было бы загрузить программу в память и запустить ее локально, используя .exe на сервере в качестве отправной точки для этого метода.

1 Ответ

0 голосов
/ 06 июня 2019

Я считаю, что Windows не загружает весь исполняемый файл в оперативную память.Это не только файлы из раздела ресурсов файла PE.Части исполняемого файла загружаются только по ссылке, и даже после загрузки всего, что нужно загрузить, Windows будет поддерживать дескриптор открытого файла, пока процесс не закроется.Пытаться закрыть эту ручку самостоятельно - плохая идея.

c / c ++ позволяет указывать флаг "SWAPFILE", который говорит Windows помещать все это в файл подкачки, но я не знаю, как вы это сделаетесделайте это с помощью c #, и я не знаю, будет ли это вообще мешать окнам держать ручку открытой в любом случае (я сомневаюсь в этом).

Если это действительно важно, если бы я был вашим бывшим ... Ябудет:

  1. Проверить мьютекс для существующего работающего экземпляра, выйти, если существует
  2. Проверить, откуда я работал.
  3. Если работает из темпа, установить мьютексчто я запускаю и просто запускаю.
  4. Если не работает из temp, скопируйте себя в% temp%, запустите эту копию и выйдите.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...