2015-03-04 6 views
1

Я делаю веб-приложение Asp.Net. Мне нужен экран для записи и сохранения записанного файла. Я искал много и получил код, который лучше всего подходит для меня от hereDirectory.Exists вызывает ошибку компиляции

Это код

public class ScreenRecorder 
{ 

    private static string tempDir = Path.GetTempPath() + "/snapshot/"; 
    private static System.Threading.Thread snap = new System.Threading.Thread(Snapshot); 

    private static System.Drawing.Rectangle _Bounds = System.Windows.Forms.Screen.PrimaryScreen.Bounds; 
    public static System.Drawing.Rectangle Bounds 
    { 
     get { return _Bounds; } 
     set { _Bounds = value; } 
    } 

    private static void Snapshot() 
    { 
     if (!Directory.Exists(tempDir)) 
      Directory.CreateDirectory(tempDir); 
     int Co = 0; 
     do 
     { 
      Co += 1; 
      System.Threading.Thread.Sleep(50); 
      System.Drawing.Bitmap X = new System.Drawing.Bitmap(_Bounds.Width, _Bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
      using(System.Drawing.Graphics G = System.Drawing.Graphics.FromImage(X)) { 
       G.CopyFromScreen(_Bounds.Location, new System.Drawing.Point(), _Bounds.Size); 
       System.Drawing.Rectangle CurBounds = new System.Drawing.Rectangle(System.Drawing.Point.Subtract(System.Windows.Forms.Cursor.Position,Bounds.Size), System.Windows.Forms.Cursor.Current.Size); 
       System.Windows.Forms.Cursors.Default.Draw(G, CurBounds); 
      } 
      System.IO.FileStream FS = new System.IO.FileStream(tempDir + FormatString(Co.ToString(), 5, '0') + ".png", System.IO.FileMode.OpenOrCreate); 
      X.Save(FS, System.Drawing.Imaging.ImageFormat.Png); 
      X.Dispose(); 
      FS.Close(); 
     } while (true); 
    } 

    public static void ClearRecording() 
    { 
     if (Directory.Exists(tempDir)) 
      Directory.Delete(tempDir, true); 
      Directory.CreateDirectory(tempDir); 
    } 

    public static void Save(string Output) 
    { 
     System.Windows.Media.Imaging.GifBitmapEncoder G = new System.Windows.Media.Imaging.GifBitmapEncoder(); 

     List<System.IO.FileStream> X = new List<System.IO.FileStream>(); 
     foreach (string Fi in Directory.GetFiles(tempDir, "*.png", SearchOption.TopDirectoryOnly)) 
     { 
      System.IO.FileStream TempStream = new System.IO.FileStream(Fi, System.IO.FileMode.Open); 
      System.Windows.Media.Imaging.BitmapFrame Frame = System.Windows.Media.Imaging.BitmapFrame.Create(TempStream); 
      X.Add(TempStream); 
      G.Frames.Add(Frame); 
     } 
     System.IO.FileStream FS = new System.IO.FileStream(Output, System.IO.FileMode.OpenOrCreate); 
     G.Save(FS); 
     FS.Close(); 

     foreach (System.IO.FileStream St in X) 
     { 
      St.Close(); 

     } 

    } 

    public static void Start() 
    { 
     snap = new System.Threading.Thread(Snapshot); 
     snap.Start(); 
    } 

    public static void Stop() 
    { 
     snap.Abort(); 
    } 

    private static string FormatString(string S, int places, char character) 
    { 
     if (S.Length >= places) 
      return S; 
     for (int X = S.Length; X <= places; X++) 
     { 
      S = character + S; 
     } 
     return S; 
    } 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ScreenRecorder.Start(); 
     System.Threading.Thread.Sleep(5000); 
     ScreenRecorder.Stop(); 
     ScreenRecorder.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\video.gif"); 
     ScreenRecorder.ClearRecording(); 
    } 
} 

Я создал новый класс в asp.net и добавил выше код, но он бросает мне ошибку как «путь имя не существует в текущем контексте» «справочник имя не существует в текущем контексте»

Вот скриншот code Как устранить эту ошибку, и я хочу, экран должен быть записан после нажатия кнопки. Но как вызвать класс при нажатии кнопки. Пожалуйста помоги.!! Заранее спасибо !!

+1

Пожалуйста, используйте соответствующее название, разместите соответствующий код и точное сообщение об ошибке компиляции или исключение и где оно произошло. Поскольку это плитка и все, кроме 6 строк всего вопроса, не имеют отношения к делу, и только путать –

+1

Кстати, вы забыли использовать 'System.IO' перед' Каталогом', хотя вы делаете это в остальной части кода. Сообщение об ошибке довольно ясно. Либо пользователь 'System.IO' всюду, либо добавьте оператор' using System.IO; '; –

+0

Какова цель этого? Вы хотите сделать снимок экрана на стороне сервера? Вы знаете, что пытаетесь это сделать? –

ответ

4

Вы пытаетесь использовать класс из другого пространства имен, на котором нет ссылки.

Есть два способа обойти это.

  • Один из способов - написать пространство имен вместе с классом, который вы хотите использовать. Например:

    if (!System.IO.Directory.Exists(tempDir)) 
        System.IO.Directory.CreateDirectory(tempDir); 
    

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

  • Затем еще один способ, чтобы ссылаться на все пространство имен путем добавления линия using System.IO;, как ответила Ария.

Там же аккуратный маленький трюк в Visual Studio:
Если класс вы пытаетесь использовать фактически существует в связанных библиотеках (в данном случае System.IO является частью mscorlib.dll, поэтому она должна быть связана по умолчанию), затем вы можете щелкнуть правой кнопкой мыши по неизвестному классу и выбрать пункт «Resolve», который добавит требуемое пространство имен в раздел using или добавит полное пространство имен к имени класса.

5

Поскольку использовать классы справочника вы должны ссылаться на System.IO;

добавить эту строку using System.IO; поверх кода позади или вы можете нажать на этом класс и нажмите Ctrl+. он предложит вам связанные пространства имен в всплывающем меню.

+0

@Shaamaan Да, по умолчанию он ссылается, но если вы добавите новый элемент Class.cs, он не будет ссылаться и на основании снимка экрана «System.IO» должен быть указан. – Aria

+0

Большое спасибо. Ошибка исчезла, и вы могли бы рассказать мне, как позвонить классу при нажатии кнопки @Aria – Anusha

+1

@ Ануша - Если у вас есть другой вопрос, вы должны поднять его как отдельный вопрос, хотя вам было бы лучше сделать некоторые прежде всего, поскольку есть несколько дубликатов этого вопроса. Если этот ответ решил вашу проблему, вы должны принять его как ответ – Sayse

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