How to pass file to the program from the command line - c#

I am writing a wpf application which should draw lines due points given in a file.
How can I pass a file in the command line to my c# program?
For example something like
MyProgram.exe < file.txt
In addition how can I do this in visual studio for debugging?
I know I can set command line args and can read them with
var args = System.Environment.GetCommandLineArgs().ToList();

You have to do is call the program in this way, "filedetails.exe myfile.txt"
Example :
C:\Users\FILEREADER>filedetails.exe myfile.txt

How can I pass a file in the command line to my c# program? For example > something like
MyProgram.exe <file.txt
You can try this Console.OpenStandardInput()

I don't think it is possible to pass file content as a parameter. You currently pass file content correctly:
MyProgram.exe < file.txt
all you need is to read it, I put a small cmd application:
static void Main()
{
string line;
while ((line = Console.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
In wpf application:
public MainWindow()
{
InitializeComponent();
var result = "";
string line;
while ((line = Console.ReadLine()) != null)
{
result += (line);
}
MessageBox.Show(result);
}
Check here for more information about about command line redirections.

Related

Wait for multiline console input to finish c#

I am supposed to write a program where the user inputs a maze and my application tries to find a way to navigate through it. The input of the maze is supposed to be something like
#####
#...#
#...#
#####
And I am supposed to use Console.OpenStandardInput(), and the user copy pastes the maze into the console. However, when I use Console.ReadLine() to wait for the user to copy paste the maze, it only reads the first line. I know for Java you just make a new Scanner(System.in), but how do I do this in c#?
EDIT:
My entire code is
class Program
{
static void Main(string[] args)
{
StreamReader sr = new StreamReader(Console.OpenStandardInput());
for (int i = 0; i < 5; i++)
{
Console.Write((char)sr.Read());
}
Console.WriteLine("done");
Console.ReadKey();
}
}
When I copy and paste in
AB
CD
From Notepad, the output becomes
AB
AB
CDcursor here
Console.ReadLine() return after every single line so you need to use loop to read all line from console till you will get null
List<string> lines = new List<string>();
string line;
while ((line = Console.ReadLine()) != null)
{
// Either you do here something with each line separately or
lines.add(line);
}
// You do something with all of the lines here

Multiple command line inputs

I am having a bit of trouble running multiple conditions through a command line argument. I have a program that makes XML files based on information found in Excel files. The main issue i am having is that when i run the program through an auto scheduling tool it reads each file as a one whole string, instead of "File 1" "File 2" it is reading it as "File1File2". This is the code for the command line:
public static void Main(string[] args)
{
string input = "";
string output = "";
if (args.Length > 0)
{
foreach (string s in args)
{
Console.WriteLine(s);
}
input = args[0];
output = args[1];
}
}
I wondered if there was a way, im aware of methods such as split string but the implementation is what i am fuzzy on

Getting an index outside bound of an array in C#

This program is supposed to show the path of a directory and the directory if its exists then it should also show the files inside with the following extensions (i.e .doc, .pdf, .jpg, .jpeg) but I'm getting an error
*Index was outside the bounds of the array.
on this line of code
string directoryPath = args[0];
This is the code in the main function
class Program
{
static void Main(string[] args)
{
string directoryPath = args[0];
string[] filesList, filesListTmp;
IFileOperation[] opList = { new FileProcNameAfter10(),
new FileProcEnc(),
new FileProcByExt("jpeg"),
new FileProcByExt("jpg"),
new FileProcByExt("doc"),
new FileProcByExt("pdf"),
new FileProcByExt("djvu")
};
if (Directory.Exists(directoryPath))
{
filesList = Directory.GetFiles(directoryPath);
while (true)
{
Thread.Sleep(500);
filesListTmp = Directory.GetFiles(directoryPath);
foreach (var elem in Enumerable.Except<string>(filesListTmp, filesList))
{
Console.WriteLine(elem);
foreach (var op in opList)
{
if (op.Accept(elem)) op.Process(elem);
}
}
filesList = filesListTmp;
if (Console.KeyAvailable == true && Console.ReadKey(true).Key == ConsoleKey.Escape) break;
}
}
else
{
Console.WriteLine("There is no such directory.");
}
}
}
How can I handle this error it seems to be common but it happens id different ways
You need to pass the necessary arguments to the program when running it. You can either do this by running the program from the command line, or else when running Visual Studio by doing the following:
Right click on project
Properties
Debug tag
Enter arguments under Start Options -> Command line arguments
You might want to pass the arguments into the program from command line.
like this:
> yourProgram.exe directoryName
Also, to avoid such problems in the code,
if(args.Length > 0){
string directoryPath = args[0];
}else{
//print a help message and exit, or do something like set the
//default directoryPath to current directory
}
Do you want the user to enter a path when the program starts or when they start the program? If it's the first, then you should add a Console.Read() method that asks for the path.
If it's the latter, then you need to pass the path as an argument when starting the program. You should also do a check against the args array before reading from it to check that it contains data and that data is a valid path.
Something like:
if(args.Length > 0 && Directory.Exists(args[0]))
{
// Do Something.
}

How to create an executable file having input file and output file as parameters?

Okay I have looked at a lot of sources but I cannot seem to find the answer. I have an assignment where I will a parameter for an input file path and a parameter for an output file path using a C# console application. My question is where can I find an example which shows the code to set parameters like that.
Thank you.
They're just command line arguments, right? For example:
public class Foo
{
private static int Main(string[] args)
{
if (args.Length != 2)
{
Console.WriteLine("Usage: Foo <input file> <output file>");
return 1; // Indicate failure
}
string inputFile = args[0];
string outputFile = args[1];
// Use inputFile and outputFile...
return 0; // Indicate success
}
}
Checkout these links (include references, source code, sanples and explanations):
http://msdn.microsoft.com/en-us/library/aa288457%28VS.71%29.aspx
http://msdn.microsoft.com/en-us/library/0wc2kk78%28VS.90%29.aspx
Check for documentation on Main method in msdn

C# Problem Reading Console Output to string

i want to launch ffmpeg from my app and retrive all console output that ffmpeg produces. Thing seems obvious, i followed many forum threads/articles like this one but i have problem, though i follow all information included there I seem to end up in dead end.
String that should contain output from ffmpeg is always empty. I've tried to see where is the problem so i made simple c# console application that only lists all execution parameters that are passed to ffmpeg, just to check if problem is caused by ffmpeg itself. In that case everything work as expected.
I also did preview console window of my app. When i launch ffmpeg i see all the output in console but the function that should recieve that output for further processing reports that string was empty. When my param-listing app is launched the only thing I see is the expected report from function that gets output.
So my question is what to do to get ffmpeg output as i intended at first place.
Thanks in advance
MTH
This is a long shot, but have you tried redirecting StandardError too?
Here is a part of my ffmpeg wrapper class, in particular showing how to collect the output and errors from ffmpeg.
I have put the Process in the GetVideoDuration() function just so you can see everything in the one place.
Setup:
My ffmpeg is on the desktop, ffPath is used to point to it.
namespace ChildTools.Tools
{
public class FFMpegWrapper
{
//path to ffmpeg (I HATE!!! MS special folders)
string ffPath = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\ffmpeg.exe";
//outputLines receives each line of output, only if they are not zero length
List<string> outputLines = new List<string>();
//In GetVideoDuration I only want the one line of output and in text form.
//To get the whole output just remove the filter I use (my search for 'Duration') and either return the List<>
//Or joint the strings from List<> (you could have used StringBuilder, but I find a List<> handier.
public string GetVideoDuration(FileInfo fi)
{
outputLines.Clear();
//I only use the information flag in this function
string strCommand = string.Concat(" -i \"", fi.FullName, "\"");
//Point ffPath to my ffmpeg
string ffPath = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\ffmpeg.exe";
Process processFfmpeg = new Process();
processFfmpeg.StartInfo.Arguments = strCommand;
processFfmpeg.StartInfo.FileName = ffPath;
//I have to say that I struggled for a while with the order that I setup the process.
//But this order below I know to work
processFfmpeg.StartInfo.UseShellExecute = false;
processFfmpeg.StartInfo.RedirectStandardOutput = true;
processFfmpeg.StartInfo.RedirectStandardError = true;
processFfmpeg.StartInfo.CreateNoWindow = true;
processFfmpeg.ErrorDataReceived += processFfmpeg_OutData;
processFfmpeg.OutputDataReceived += processFfmpeg_OutData;
processFfmpeg.EnableRaisingEvents = true;
processFfmpeg.Start();
processFfmpeg.BeginOutputReadLine();
processFfmpeg.BeginErrorReadLine();
processFfmpeg.WaitForExit();
//I filter the lines because I only want 'Duration' this time
string oStr = "";
foreach (string str in outputLines)
{
if (str.Contains("Duration"))
{
oStr = str;
}
}
//return a single string with the duration line
return oStr;
}
private void processFfmpeg_OutData(object sender, DataReceivedEventArgs e)
{
//The data we want is in e.Data, you must be careful of null strings
string strMessage = e.Data;
if outputLines != null && strMessage != null && strMessage.Length > 0)
{
outputLines.Add(string.Concat( strMessage,"\n"));
//Try a Console output here to see all of the output. Particularly
//useful when you are examining the packets and working out timeframes
//Console.WriteLine(strMessage);
}
}
}
}

Categories