Создать файл без открытия / блокировки? - PullRequest
3 голосов
/ 22 января 2010

Кто-нибудь знает способ (достаточно простой) создать файл без его фактического открытия / блокировки? В классе File методы для создания файла всегда возвращают FileStream. Я хочу создать файл, переименовать его (с помощью File.Move) и затем использовать его.

Теперь мне нужно:

  • Создать его
  • Закрыть
  • Переименовать
  • Открыть для использования

Ответы [ 5 ]

8 голосов
/ 22 января 2010

Возможно, вы можете попробовать использовать File.WriteAllText метод (String, String) с именем файла и пустой строкой.

Создает новый файл, пишет указанная строка в файл, а затем закрывает файл Если целевой файл уже существует, оно перезаписано.

2 голосов
/ 22 января 2010
using (File.Create(...))  { }

Хотя это кратко откроет ваш файл (но сразу же закроет его снова), код должен выглядеть довольно незаметно.

Даже если вы сделали какой-нибудь P / Invoke-вызов функции Win32 API, вы бы получили дескриптор файла. Я не думаю, что есть способ создать файл без уведомления сразу после его открытия.

Я думаю, что реальная проблема заключается в том, почему вы идете по поводу создания файла так, как вы планировали. Создание файла в одном месте, просто чтобы переместить его в другое место, кажется не очень эффективным. Есть ли для этого особая причина?

2 голосов
/ 22 января 2010

Как насчет использования File.WriteAllBytes метода?

// Summary:
//     Creates a new file, writes the specified byte array to the file, and then
//     closes the file. If the target file already exists, it is overwritten.
1 голос
/ 10 декабря 2017

Другой способ - использовать FileStream и закрыть его после создания файла. Это не заблокирует файл. Код будет выглядеть так:

FileStream fs = новый FileStream (filePath, FileMode.Create);

fs.Flush (истина);

fs.Close ();

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

Ниже приведена программа тестирования для проверки работоспособности.

   using System; 
   using System.Collections.Generic; 
   using System.IO; using
   System.Linq;
   using System.Text; 
   namespace FileLocking {
   class Program
   {
    static void Main(string[] args)
    {
        string str = @"C:\Test\TestFileLocking.Processing";
        FileIOTest obj = new FileIOTest();
        obj.CreateFile(str);
    }
}

class FileIOTest
{
    internal void CreateFile(string filePath)
    {
        try
        {
            //File.Create(filePath);

            FileStream fs = new FileStream(filePath, FileMode.Create);
            fs.Flush(true);
            fs.Close();

            TryToAccessFile(filePath);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    void TryToAccessFile(string filePath)
    {
        try
        {
            string newFile = Path.ChangeExtension(filePath, ".locked");
            File.Move(filePath, newFile);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
} }

Если вы используете File.Create (прокомментированный в приведенном выше коде), он выдаст ошибку, сообщая, что файл используется другим процессом.

1 голос
/ 22 января 2010

Невероятно безобразный хак, наверное, самый сложный способ достижения вашей цели: использовать Process класс

processInfo = new ProcessStartInfo("cmd.exe", "/C " + Command);
processInfo.CreateNoWindow = true; 
processInfo.UseShellExecute = false;
process = process.Start(processInfo);
process.WaitForExit();

где Command будет echo 2>> yourfile.txt

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