小编Mat*_*ley的帖子

在C#中预分配文件空间?

我正在创建一个下载应用程序,我希望在它们实际下载之前预先在硬盘上分配文件的空间,因为它们可能相当大,没有人喜欢看到"此驱动器已满,请删除一些文件并再试一次. " 所以,从那个角度来看,我写了这个.

// Quick, and very dirty
System.IO.File.WriteAllBytes(filename, new byte[f.Length]);
Run Code Online (Sandbox Code Playgroud)

它可以工作,至少你下载一个几百MB的文件,甚至可能是GB的文件,如果没有完全消除页面文件并完全杀死你的系统内存,你就会把Windows扔进吵架的狂热中.哎呀.

所以,通过一点启示,我开始使用以下算法.

using (FileStream outFile = System.IO.File.Create(filename))
{
    // 4194304 = 4MB; loops from 1 block in so that we leave the loop one 
    // block short
    byte[] buff = new byte[4194304];
    for (int i = buff.Length; i < f.Length; i += buff.Length)
    {
        outFile.Write(buff, 0, buff.Length);
    }
    outFile.Write(buff, 0, f.Length % buff.Length);
}
Run Code Online (Sandbox Code Playgroud)

这很有效,并且不会遇到最后解决方案的严重内存问题.虽然它仍然很慢,特别是在较旧的硬件上,因为它将数据(可能是GB的)数据输出到磁盘.

问题是:有没有更好的方法来完成同样的事情?有没有办法告诉Windows创建一个x大小的文件,只需在文件系统上分配空间,而不是实际写出一吨数据.我根本不关心初始化文件中的数据(我正在使用的协议 - bittorrent - 为它发送的文件提供哈希值,因此随机未初始化数据的最坏情况是我得到了一个幸运的巧合和部分文件是正确的).

c# file-io file

16
推荐指数
2
解决办法
5151
查看次数

假X11显示?

我有一个使用AWT的Java程序,我想在无头系统上运行.程序的显示除了显示统计数据外什么都不做.程序结束后退出.显示屏上没有用户交互.该程序创建了一个我在构建系统中使用的输出文件.

有没有办法在没有配置X11显示器的情况下运行Java程序?我可以强制Java运行程序而不尝试显示任何内容吗?我无法访问源代码(它只是.jar文件),因此我无法对源代码进行修改.

有关如何让它工作的任何想法?

java linux x11 awt

15
推荐指数
4
解决办法
1万
查看次数

你可以在每个区块中捕获多种类型的异常吗?

这个问题接近我想做的事情,但并不完全存在.

有没有办法简化以下代码?

private bool ValidDirectory(string directory)
{
    if (!Directory.Exists(directory))
    {
        if (MessageBox.Show(directory + " does not exist. Do you wish to create it?", this.Text) 
            == DialogResult.OK)
        {
            try
            {
                Directory.CreateDirectory(directory);
                return true;
            }
            catch (IOException ex)
            {
                lblBpsError.Text = ex.Message;
            }
            catch (UnauthorizedAccessException ex)
            {
                lblBpsError.Text = ex.Message;
            }
            catch (PathTooLongException ex)
            {
                lblBpsError.Text = ex.Message;
            }
            catch (DirectoryNotFoundException ex)
            {
                lblBpsError.Text = ex.Message;
            }
            catch (NotSupportedException ex)
            {
                lblBpsError.Text = ex.Message;
            }
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

这似乎是浪费,如果我以后想要改变向用户报告错误的方式,或者我想记录这些错误,或者其他什么,那么我必须更改5个不同的catch块.我错过了一些东西,还是公然反对代码重用? …

c# try-catch

15
推荐指数
2
解决办法
7434
查看次数

如何在Windows上为任务栏创建工具栏?

如何创建自己的任务栏工具栏,即Windows Media Player:

Windows Media Player的"开始"栏工具栏http://me.monoxide.ws/images/wmp-toolbar.gif

任何语言的实例或文档甚至开源软件都会受到赞赏,但谷歌并不是很有帮助.最终,我希望在C#中实现这一点(我希望需要P/Invoke),但是任何语言和Vista都可以接受/有用.

.net windows taskbar

15
推荐指数
1
解决办法
3958
查看次数

这里发生了什么?如果没有,我如何调用默认构造函数?

给出以下代码:

public struct Foo
{
    public Foo(int bar, int baz) : this()
    {
        Bar = bar; // Err 1, 2
        Baz = baz; // Err 3
    }

    public int Bar { get; private set; }
    public int Baz { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

什么是: this()真正做到?没有默认构造函数,所以它调用了什么?没有这个附录,整个事情就会因错误而崩溃.

Error   1   The 'this' object cannot be used before all of its fields are assigned to
Error   2   Backing field for automatically implemented property 'Foo.Bar' must be fully assigned before control is …

c# struct

15
推荐指数
2
解决办法
4948
查看次数

导致INSERT失败的TRIGGER?可能?

在清理这个答案时,TRIGGER在MySQL 中学到了一些关于s和存储过程的知识,但我惊讶地发现,虽然BEFORE INSERTBEFORE UPDATE触发器可以修改数据,但它们似乎不会导致插入/更新失败(即验证).在这种特殊情况下,我能够通过操纵数据来使这一点工作,从而导致主键复制,在这种特殊情况下,这是有意义的,但在一般意义上并不一定有意义.

这种功能在MySQL中是否可行?在任何其他RDBMS(我的经验仅限于MySQL)?也许是一种THROW EXCEPTION风格语法?

mysql rdbms triggers

14
推荐指数
3
解决办法
2万
查看次数

如何在命名虚拟主机的根目录中启用mod_dav_svn?

这可能吗?我遇到了SVN客户端无法访问存储库的问题,并显示以下错误消息:

存储库永久移动到' http://svn.example.com/test/ '; 请搬迁

如果我将'/'添加到我尝试访问的路径的末尾,它只是将其再次剥离,并显示相同的错误消息.我的配置文件如下:

<VirtualHost *>
  ServerName svn.example.com
  # Normal VirtualHost stuff here

  <Location /svn>
    # Uncomment this to enable the repository
    DAV svn
    SVNParentPath /some/path/to/repositories

    # Setup mod_authz_svn, etc, etc here
  </Location>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

注意:这有效.但是,如果我将位置更改为刚/停止再次使用上述错误.是否可以使用根目录,或者我在这里遗漏了什么?当从根目录提供存储库时,Firefox会显示存储库列表.

正如其他人所指出的那样,这似乎只是一个名为虚拟主机的问题......任何人都有任何聪明的想法为什么?

svn apache

14
推荐指数
1
解决办法
9390
查看次数

从拥有类外部调用C#事件?

在任何情况下是否有可能实现这一目标?

我目前的情况如下:

public class CustomForm : Form
{
    public class CustomGUIElement
    {
    ...
        public event MouseEventHandler Click;
        // etc, and so forth.
    ...
    }

    private List<CustomGUIElement> _elements;

    ...

    public void CustomForm_Click(object sender, MouseEventArgs e)
    {
        // we might want to call one of the _elements[n].Click in here
        // but we can't because we aren't in the same class.
    }
}
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是有一个类似的功能:

internal enum GUIElementHandlers { Click, ... }
internal void CustomGUIElement::CallHandler(GUIElementHandler h, object[] args) {
    switch (h) {
        case Click: …
Run Code Online (Sandbox Code Playgroud)

c# events inheritance

13
推荐指数
2
解决办法
2万
查看次数

如何检测我们是否在UI线程上?

为了参数起见,将UI线程视为一个线程,该线程已调用Application.Run()或调用其中一个重载,并且有一个活动的消息循环正在运行.

有没有办法检测我们当前是否正在这样的线程上执行?

我想要这个的原因是因为我有一个具有长期运行的私有函数的类.该类本身已经是多线程的,并且该类的使用使得它可以从UI或后台线程进行处理.这个功能也属于这个网络.但我不希望它阻止UI线程.所以我想检测我是否在UI线程上运行,如果是这样,将函数调用转换为后台线程(可能ThreadPool,但这对于此讨论来说不是问题).这完全表现良好,但后台线程可能依赖于函数的输出,因此阻塞它们更好,而UI线程以更"一劳永逸"的方式访问它.

c# multithreading ui-thread winforms

13
推荐指数
5
解决办法
2万
查看次数

ManualResetEvent与Thread.Sleep

我实现了以下后台处理线程,其中JobsQueue<T>:

static void WorkThread()
{
    while (working)
    {
        var job;

        lock (Jobs)
        {
            if (Jobs.Count > 0)
                job = Jobs.Dequeue();
        }

        if (job == null)
        {
            Thread.Sleep(1);
        }
        else
        {
            // [snip]: Process job.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这产生正在进入作业时之间的noticable延迟,当他们实际上开始运行(作业批次在一旦进入,而每个工作只是[比较]小)的延迟是不是一个大问题,但我开始思考这个问题,并做了以下改变:

static ManualResetEvent _workerWait = new ManualResetEvent(false);
// ...
    if (job == null)
    {
        lock (_workerWait)
        {
            _workerWait.Reset();
        }
        _workerWait.WaitOne();
    }
Run Code Online (Sandbox Code Playgroud)

线程添加作业现在锁定_workerWait_workerWait.Set()在完成添加作业时调用.这个解决方案(貌似)立即开始处理工作,延迟完全消失.

我的问题部分是"为什么会发生这种情况?",被认为Thread.Sleep(int)可以比你指定的更长时间地睡眠,部分是"如何ManualResetEvent实现这种性能水平?".

编辑:由于有人询问了排队项目的功能,现在它和目前的完整系统一起.

public void RunTriggers(string data)
{
    lock …
Run Code Online (Sandbox Code Playgroud)

c# multithreading sleep manualresetevent

12
推荐指数
2
解决办法
2万
查看次数