-
Notifications
You must be signed in to change notification settings - Fork 0
/
StdInEx.cs
80 lines (65 loc) · 2 KB
/
StdInEx.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
// Original source:
// http://stackoverflow.com/questions/3453220/how-to-detect-if-console-in-stdin-has-been-redirected/3453272#3453272
public class StdInEx
{
private static List<DeleteFileWhenDone> _deleteFiles = new List<DeleteFileWhenDone>();
public static bool IsOutputRedirected
{
get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdout)); }
}
public static FileType StdOutType
{
get { return GetFileType(GetStdHandle(StdHandle.Stdout)); }
}
public static bool IsInputRedirected
{
get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdin)); }
}
public static FileType StdInType
{
get { return GetFileType(GetStdHandle(StdHandle.Stdin)); }
}
public static bool IsErrorRedirected
{
get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stderr)); }
}
public static FileType StdErrType
{
get { return GetFileType(GetStdHandle(StdHandle.Stderr)); }
}
public static string RedirectInputToFile()
{
string f = Path.GetTempFileName();
File.WriteAllText(f, Console.In.ReadToEnd());
_deleteFiles.Add(new DeleteFileWhenDone(f));
return f;
}
//
// P/Invoke:
//
public enum FileType { Unknown, Disk, Char, Pipe };
private enum StdHandle { Stdin = -10, Stdout = -11, Stderr = -12 };
[DllImport("kernel32.dll")]
private static extern FileType GetFileType( IntPtr hdl );
[DllImport("kernel32.dll")]
private static extern IntPtr GetStdHandle( StdHandle std );
}
public class DeleteFileWhenDone
{
public string _file { get; private set; }
public DeleteFileWhenDone( string file )
{
_file = file;
}
~DeleteFileWhenDone()
{
if (File.Exists(_file)) {
File.SetAttributes(_file, FileAttributes.Normal);
File.Delete(_file);
}
}
}