2015-01-17 5 views
2

저는 C#의 아마추어이며 이에 대한 대답을 찾을 수 없었습니다. 아마도 올바른 용어를 사용하지 않을 것입니다.내 응용 프로그램과 함께 열린 파일의 경로 + 파일 이름을 가져옵니다.

비디오 파일을 내 exe 응용 프로그램으로 끌면 해당 응용 프로그램이 파일로 시작되었으며 해당 파일의 경로와 파일 이름을 알 수 있기를 바랍니다. 이렇게하면 사용자가 파일> 열기 메뉴를 사용할 필요가 없습니다.

희망이 있습니다. 감사합니다.

+0

무엇을 시도하셨습니까? 거기에 몇 가지 코드가 있습니까? –

+0

귀하의 질문이 너무 광범위합니다. 끌어서 놓기 기능과 exe 파일 연결에 대해 조사해야합니다. – Steve

+0

감사합니다. 더 자세히 조사하려고합니다. 나는 파일 연합을 맺은 것이 아니다. 내가 원하는 것은 시작할 때 경로 변수를 전달할 수 있어야한다는 것입니다. –

답변

5

응용 프로그램을 시작하는 데 사용 된 명령 줄 인수를 확인할 수 있습니다. .exe 파일에 파일을 놓아서 응용 프로그램을 시작한 경우 파일의 경로와 함께 단일 명령 줄 인수가 있습니다.

string[] args = System.Environment.GetCommandLineArgs(); 
if(args.Length == 1) 
{ 
    // make sure it is a file and not some other command-line argument 
    if(System.IO.File.Exists(args[0]) 
    { 
     string filePath = args[0]; 
     // open file etc. 
    } 
} 

질문 제목에 경로와 파일 이름이 필요합니다. 당신은 사용하여 파일 이름을 얻을 수 있습니다 :

System.IO.Path.GetFileName(filePath); // returns file.ext 
+1

; 매개 변수를 'Main'으로 설정합니다.이 명령에는 동일한 명령 행 인수가 들어 있습니다. –

+0

@BenVoigt 네, 그게 효과가 있습니다. 방금 위의 방법으로 코드에서 아무 곳에서나 cmdline args를 얻을 수 있다는 것을 기억했습니다. – helb

+0

당신의 접근 방식은 좀 더 일반적입니다. 둘 다 언급할만한 가치가 있다고 생각합니다. 아무도 따라 가지 않고 생각이 다릅니다. –

0

응용 프로그램의 명령 줄 인수가 필요합니다. 탐색기에서 응용 프로그램에 파일을 놓으면 탐색기는 탐색기에서 놓은 파일로 응용 프로그램을 엽니 다. 원하는 수만큼 파일을 선택하고 응용 프로그램에 놓고이 코드 줄을 사용하면 files은 이러한 명령 줄 인수의 배열이됩니다.

string[] files = Environment.GetCommandLineArgs(); 
+0

미안하지만, 당신이 묻고있는 것을 얻지 못했습니다. 그래서 나는 내 대답을 편집했다. –

+0

OK 이것은 나에게도 효과적이며 가장 간단한 해결책입니다. 문자열 변수 만 반환하고 경로는 반환하지 않으므로 어떻게 파일 이름을이 파일에서 추출 할 수 있습니까? –

+0

응용 프로그램에서 삭제 한 모든 파일을 반환합니다. 'files'는 문자열 배열입니다. 예를 들어 첫 번째 파일은'files [0]'에 있습니다.당신이 요구하는 것이 맞습니까? 또는 경로없이 파일 이름 만 가져오고 싶습니까? 그건 그렇고, 당신의 대답이었던 대답을 upvote하고 받아들이는 것을 잊지 마십시오. –

2

당신이 C# 응용 프로그램으로 파일을 드래그하면, 그것은 것입니다 해당 응용 프로그램에 명령 줄 인수로 간다. 콘솔 응용 프로그램과 마찬가지로 Program 클래스의 Main 메서드에서이를 catch 할 수 있습니다.

Windows Forms 응용 프로그램을 사용하여 설명하겠습니다.

솔루션에서 프로그램 클래스를 엽니 다. 프로그램 클래스는 다음과 같아야합니다.

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

기본적으로 Windows Forms 응용 프로그램을 만들 때 명령 줄 인수는 처리하지 않습니다. 당신은 Main 메서드의 서명에 작은 변화를 확인해야합니다, 그래서 인수를받을 수 있습니다

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main(string[] args) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

지금 당신이 응용 프로그램에 전달 파일 이름 인수를 처리 할 수 ​​있습니다. 기본적으로 Windows는 파일 이름을 첫 번째 인수로 사용합니다. 다음과 같이하십시오.

static void Main(string[] args) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     // Before Application.Run method, treat the argument passed. 
     // I created an overload of the constructor of my Form1, so 
     // it can receive the File Name and load the file on some TextBox. 

     string fileName = null; 

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

     Application.Run(new Form1(fileName)); 
    } 

내 Form1의 생성자 오버로드를 알고 싶다면 여기를 참조하십시오. 희망이 도움이됩니다!

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public Form1(string fileName) : this() 
    { 
     if (fileName == null) 
      return; 

     if (!File.Exists(fileName)) 
     { 
      MessageBox.Show("Invalid file name."); 
      return; 
     } 

     textBox1.Text = File.ReadAllText(fileName); 
    } 
} 
+0

"해야 할 부분"을 제외한 모든 부분이 정확합니다. .NET에서 System.Environment는 추후에 액세스 권한을 부여합니다 (냉담의 답변이 보여주는 것처럼). 일반적인 Win32 프로그램에서,'GetCommandLine' API 호출은 않습니다. Main에서 특별히 처리 할 필요는 없습니다.이 경우에는 사용자가 더 편리하게 사용할 수 있도록 인수가 제공됩니다. –

+0

네, 맞습니다. 나는 그것을 잊었다. – Ismael

+0

감사합니다 이스마엘. 이것은 나를 위해 일했지만 파일의 경로 내용 + 파일 이름이 아닌 텍스트 내용을 얻었 기 때문에 한 가지 변경을해야했습니다. textBox1.Text = File.ReadAllText (fileName); textBox1.Text = fileName으로 변경되었습니다. –