2014-09-16 3 views
3

После публикации моего приложения я могу назначить exe-файл моего приложения по умолчанию для открытия файлов .txt. Здесь, как я могу получить filePath для файла, который вызвал приложение?Создание моего приложения по умолчанию для открытия всех файлов .txt

public MainWindow() 
    { 
     InitializeComponent(); 
     string filePath = ""; 
     FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
     StreamReader sr = new StreamReader(fs); 
     txt.Text = sr.ReadToEnd(); 
     sr.Close(); 
     fs.Close(); 
    } 

Здесь как я могу получить filePath, когда пользователь дважды щелкнул на каком-то txt-файле из explorer ..?

+0

просто в сторону, вы можете использовать 'using' блоки, а не вручную закрыть' FileStream 'и' StreamReader'. Это неважно, но это хорошая привычка. –

+0

Настройка в качестве приложения по умолчанию требует внесения изменений в реестр, что может потребовать повышенных прав. – pushpraj

+0

Проверить http://stackoverflow.com/questions/2681878/associate-file-extension-with-application – NoChance

ответ

1

Существует два способа получить аргументы командной строки в .NET. Вы можете поместить список параметров в свой метод Main, или вы можете использовать метод Environment.GetCommandLineArgs.

var allArgs = Environment.GetCommandLineArgs(); 
// The first element is the path to the EXE. Skip over it to get the actual arguments. 
var userSpecifiedArguments = allArgs.Skip(1); 

Поскольку вы используете WPF (и, следовательно, не контролируем метод Main), лучше всего было бы пойти с GetCommandLineArgs.

+0

Отлично и отлично. Вот почему у вас такая большая репутация .. Спасибо u .. – Sayka

+0

Вы МОЖЕТЕ (и вообще, должны) управлять методом 'Main' в любой программе, даже если это происходит с использованием WPF.WPF вообще не имеет значения для вопрос. – Alejandro

2

Файл args передается через аргументы командной строки. Таким образом, вам нужно проверить файл Program.cs (возможно), чтобы посмотреть на параметр string[] args.

void Main(string[] args) 
{ 
    string filename; 

    if(args != null && args.Length > 0) 
     filename = args[0]; 
    else 
     filename = null; 

    // use filename as appropriate, perhaps via passing it to your entry Form. 
} 

По сути, вызов, который explorer.exe (Проводник Windows, рабочий стол, меню пуск, что там у вас) делает, когда вы дважды щелкните test.txt, когда Блокнот текст по умолчанию редактор, выглядит примерно так:

notepad.exe C:\users\name\desktop\test.txt 

это такой же синтаксис, как вы будете использовать в командной строке для вызова robocopy (хотя вы, вероятно, нужно больше аргументов, чем это):

robocopy source.txt destination.txt 

В результате этого рабочего процесса вы также можете переопределить поведение ассоциации файлов по умолчанию, чтобы запустить программу по вашему выбору для чтения файла, аналогичную программному Open With.... Следующее будет всегда открыть Блокнот, независимо от того, какое другое приложение может быть связано с расширением .jpg (что, вероятно, не является записной книжкой).

notepad.exe C:\users\name\desktop\test.jpg 
+0

Спасибо за ответ, я проверю его с помощью приложения Windows Forms и скажу u. Но в wpf нет основной пустоты. Любое решение? – Sayka

+0

@Sayka ах, вы отметили свой вопрос [tag: winforms]. Я не уверен в этом. Я могу немного потрудиться и посмотреть, чем я могу стать, я не сразу знаком с рабочим процессом WPF. Но он должен быть везде, где находится точка входа в приложение. –

+0

Спасибо, Мэтью. Из вашего подробного объяснения я узнал, как аргументы передаются в приложение. – Sayka

0

С помощью Мэтью Haugen я сделал это, и его работы для форм применения

Program.cs

static class Program 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1(args != null && args.Length > 0 ? args[0] : "")); 
    } 
} 

и форма

public partial class Form1 : Form 
{ 
    public Form1(string fileName) 
    { 
     InitializeComponent(); 
     if (fileName != "") 
      using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) 
      using (var sr = new StreamReader(fs)) textBox1.Text = sr.ReadToEnd(); 
    } 
} 

I» предположим, что это может помочь некоторым для приложения Forms. Но я до сих пор ищу ответ для делать то же самое в WPF ..

0

Вот решение для WPF

Мэтью показал мне, как это сделать в Windows Forms приложения, и я исследовал немного и найдено решение для wpf.

Вот шаг за шагом я сделал ..

Сначала я добавил пустую Основную функцию в App.xaml.cs

public partial class App : Application 
{ 
    [STAThread] 

    public static void Main() 
    { 

    } 
} 

При составлении он показал ошибку, говорящую нескольких точек входа для приложения. При двойном щелчке он перемещается в файл App.g.cs, где существует фактическая точка входа.

public partial class App : System.Windows.Application { 

    /// <summary> 
    /// InitializeComponent 
    /// </summary> 
    [System.Diagnostics.DebuggerNonUserCodeAttribute()] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")] 
    public void InitializeComponent() { 

     #line 4 "..\..\App.xaml" 
     this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative); 

     #line default 
     #line hidden 
    } 

    /// <summary> 
    /// Application Entry Point. 
    /// </summary> 
    [System.STAThreadAttribute()] 
    [System.Diagnostics.DebuggerNonUserCodeAttribute()] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")] 
    public static void Main() { 
     FileOpen.App app = new FileOpen.App(); 
     app.InitializeComponent(); 
     app.Run(); 
    } 
} 

.

Теперь я удалил все строки и скопировал точку входа в приложение.xaml.cs А также удалены StartupUri от App.xaml

<Application x:Class="FileOpen.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     > 
<Application.Resources> 

</Application.Resources> 

Теперь App.g.cs

public partial class App : System.Windows.Application { 

    /// <summary> 
    /// Application Entry Point. 

} 

И в App.xaml.cs

public partial class App : Application 
{ 
    [System.STAThreadAttribute()] 
    [System.Diagnostics.DebuggerNonUserCodeAttribute()] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")] 
    public static void Main(string[] args) 
    { 
     MainWindow window = new MainWindow(args != null && args.Length > 0 ? args[0] : ""); 
     window.ShowDialog(); 
    } 
} 

И MainWindow

public partial class MainWindow : Window 
{ 
    public MainWindow(string filePath) 
    { 
     InitializeComponent(); 
     if (filePath != "") 
      using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
      using (var sr = new StreamReader(fs)) txt.Text = sr.ReadToEnd(); 
    } 
} 
1

Существует несколько способов сделать ваше приложение стандартным приложением для определенного типа файла.

  1. Вы можете изменить значение реестра вручную и указать путь приложения для расширения .txt. HKEY_CURRENT_USER \ Software \ Classes
  2. Присвоить свойства в проекте установки: Project свойства-> Publish-> Options-> Assosiations Файл -> [Добавить расширения]
  3. Вы можете написать код, чтобы изменить реестра и связать приложение по умолчанию для конкретного расширения.

[DllImport("Kernel32.dll")] 
private static extern uint GetShortPathName(string lpszLongPath, 
    [Out] StringBuilder lpszShortPath, uint cchBuffer); 

// Return short path format of a file name 
private static string ToShortPathName(string longName) 
{ 
    StringBuilder s = new StringBuilder(1000); 
    uint iSize = (uint)s.Capacity; 
    uint iRet = GetShortPathName(longName, s, iSize); 
    return s.ToString(); 
} 

// Associate file extension with progID, description, icon and application 
public static void Associate(string extension, 
     string progID, string description, string icon, string application) 
{ 
    Registry.ClassesRoot.CreateSubKey(extension).SetValue("", progID); 
    if (progID != null && progID.Length > 0) 
     using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(progID)) 
     { 
      if (description != null) 
       key.SetValue("", description); 
      if (icon != null) 
       key.CreateSubKey("DefaultIcon").SetValue("", ToShortPathName(icon)); 
      if (application != null) 
       key.CreateSubKey(@"Shell\Open\Command").SetValue("", 
          ToShortPathName(application) + " \"%1\""); 
     } 
} 

// Return true if extension already associated in registry 
public static bool IsAssociated(string extension) 
{ 
    return (Registry.ClassesRoot.OpenSubKey(extension, false) != null); 
} 

///How to Associate 
///.ext: give the extension here ie. .txt 
///ClassID.ProgID: Give the unique id for your application. ie. MyFirstApplication1001 
///ext File:Description of your application 
///YourIcon.ico:Icon file 
///YourApplication.exe:Your application name 
Associate(".ext", "ClassID.ProgID", "ext File", "YourIcon.ico", "YourApplication.exe"); 

Вы также можете прочитать эту статью и скачать пример того же от here

+0

Извините. Это не я смотрел .. – Sayka

Смежные вопросы